zoukankan      html  css  js  c++  java
  • 【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]
  • 相关阅读:
    因打卡界面更新,稍修改主要代码【2021/1/16】
    Python爬虫:使用Selenium爬取指定上市公司(如浦发银行)的今年公告信息
    Python爬虫:爬取福州链家的不同区域的二手房成交信息
    蓝精灵小组第十三周学习总结
    2020-2021-1学期 20202417《网络空间安全专业导论》第十三周学习总结
    蓝精灵小组第十二周学习总结
    蓝精灵小组第十一周学习总结
    2020-2021-1学期 20202417《网络空间安全专业导论》第十二周学习总结
    2020-2021-1学期 20202417《网络空间安全专业导论》第十一周学习总结
    2020-2021-1学期 20202417《网络空间安全专业导论》第十周学习总结
  • 原文地址:https://www.cnblogs.com/seyjs/p/12349868.html
Copyright © 2011-2022 走看看