1352. Product of the Last K Numbers

31 阅读1分钟

image.png

image.png

方法 : 前缀积

  • 我们知道只要某个数为0,那么它前面的那些数就都没有用了,我们直接清理掉就好了。
  • 题目中说了K是小于数据长度的,如果维护的前缀积列表长度小于K,那么说明在后K个中出现过的0,因此长度不够K,这种情况下直接返回0就行;
  • 否则按照上面的逻辑就可以了,由于要维护乘积,所以列表的第一个元素添加一个1作为辅助元素。
class ProductOfNumbers {
    List<Integer> list;
    public ProductOfNumbers() {
        list = new ArrayList<>();
        list.add(1); // 前置1,方便计算
    }
    
    public void add(int num) {
        // 遇到0,清空list
        if (num == 0) {
            list = new ArrayList<>();
            list.add(1);
        } else {
            int preProduct = list.get(list.size() - 1);
            int curProduct = preProduct * num;
            list.add(curProduct); // 计算连乘
        }
     }
    
    public int getProduct(int k) {
        // 范围超了,可能是之前截断了
        if (k > list.size() - 1) { // 有一个不算数的1
            return 0;
        }
        // 两个前缀积的差异,为后k个成绩
        int cur = list.get(list.size() - 1);
        int pre = list.get(list.size() - 1 - k);
        return cur / pre;
    }
}