【leetcode】1352. Product of the Last K Numbers

题目如下:

Implement the class ProductOfNumbers that supports two methods:

1. add(int num)

  • Adds the number num to the back of the current list of numbers.

2. getProduct(int k)

  • Returns the product of the last k numbers in the current list.
  • You can assume that always the current list has at least k numbers.

At any time, the product of any contiguous sequence of numbers will fit into a single 32-bit integer without overflowing.

Example:

Input
["ProductOfNumbers","add","add","add","add","add","getProduct","getProduct","getProduct","add","getProduct"]
[[],[3],[0],[2],[5],[4],[2],[3],[4],[8],[2]]

Output
[null,null,null,null,null,null,20,40,0,null,32]

Explanation
ProductOfNumbers productOfNumbers = new ProductOfNumbers();
productOfNumbers.add(3);        // [3]
productOfNumbers.add(0);        // [3,0]
productOfNumbers.add(2);        // [3,0,2]
productOfNumbers.add(5);        // [3,0,2,5]
productOfNumbers.add(4);        // [3,0,2,5,4]
productOfNumbers.getProduct(2); // return 20. The product of the last 2 numbers is 5 * 4 = 20
productOfNumbers.getProduct(3); // return 40. The product of the last 3 numbers is 2 * 5 * 4 = 40
productOfNumbers.getProduct(4); // return 0. The product of the last 4 numbers is 0 * 2 * 5 * 4 = 0
productOfNumbers.add(8);        // [3,0,2,5,4,8]
productOfNumbers.getProduct(2); // return 32. The product of the last 2 numbers is 4 * 8 = 32 

Constraints:

  • There will be at most 40000 operations considering both add and getProduct.
  • 0 <= num <= 100
  • 1 <= k <= 40000

解题思路:如果是求最后k个数字的和,那么可以缓存0~i区间的和,记为dp[i] ,如果要求最后k数和,那么有 dp[num_count] - dp[num_count - k]。对于求乘积,思路是一样的,但是要考虑到元素值可能为0的情况,对于dp[i],如果num = 0,那么dp[i] = 0,如果dp[i-1] = 0,那么dp[i] = num;否则 dp[i] = num * dp[i-1]。当然,我们还需要保存最后一个输入的num = 0时候的序号。这样在计算最后k个数乘积的时候,先判断k个数中包不包含最后的那个0,包含的话结果为0;不包含的则结果为 dp[-1]/dp[-2] (dp[-2] != 0);而如果dp[-2] = 0,则结果为dp[-1]。

代码如下:

class ProductOfNumbers(object):

    def __init__(self):
        self.l = []
        self.last_0 = None
        
        

    def add(self, num):
        """
        :type num: int
        :rtype: None
        """
        if len(self.l) == 0:
            self.l.append(num)
        else:
            if self.l[-1] == 0:
                self.l.append(num)
            else:
                self.l.append(num * self.l[-1])
        
        if num == 0:
            self.last_0 = len(self.l) - 1
        
    def getProduct(self, k):
        """
        :type k: int
        :rtype: int
        """
        if self.last_0 != None and len(self.l) - k  <= self.last_0:
            return 0
        elif k == len(self.l):
            return self.l[-1]
        elif self.l[len(self.l) - k - 1] == 0:
            return self.l[-1]
        return self.l[-1] / self.l[len(self.l) - k - 1]

 

posted @ 2020-02-23 15:01  seyjs  阅读(302)  评论(0编辑  收藏  举报