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]
  • 相关阅读:
    无锁并行框架构建复杂消费模型
    Disruptor框架EventProcessor和Workpool的使用
    .NET工作准备--04ASP.NET
    .NET工作准备--03进阶知识
    .NET工作准备--02基础知识
    .NET工作准备--01前言
    Java核心编程快速入门
    IntellijIDEA快速入门(Windows版)
    企业模式和设计模式快速入门
    架构设计深入学习02-概念架构与细化架构
  • 原文地址:https://www.cnblogs.com/seyjs/p/12349868.html
Copyright © 2011-2022 走看看