152. 乘积最大子数组

  1. [题目链接](152. 乘积最大子数组 - 力扣(LeetCode))

  2. 解题思路:子数组问题,考虑【以i结尾】结果是什么,求出所有的结果,最大的那个就是结果。

    • 【以i结尾】结果是什么?我们可以利用【i-1】计算过的内容。
      • nums[i]如果是0,那么结果就是0
      • nums[i]如果大于0,那么我们就希望得到【以i-1结尾】的最大的连续正数是什么
      • nums[i]如果小于0,那么我们就希望得到【以i-1结尾】的最大的连续负数是什么
      • 只要维持上述的内容,就可以得到全部【以i结尾】的结果
  3. 代码

    class Solution:
    def maxProduct(self, nums: List[int]) -> int:
    # 子数组 求以i结尾,最大的结果是什么
    # 如果nums[i]是正数,则想要前面最大的正数是多少
    # 如果nums[i]是负数,则想要前面最小的负数是多少
    max_p = 0 # 前面最大的正数 0表示i-1结尾,没有正数
    min_n = 0 # 前面最小的负数 0表示i-1结尾,没有负数
    zero = False # 前面是否有0
    ans = nums[0]
    if nums[0] > 0:
    max_p = nums[0]
    elif nums[0] == 0:
    zero = True
    else:
    min_n = nums[0]
    for i in range(1, len(nums)):
    num = nums[i]
    if num == 0:
    zero = True
    max_p = 0
    min_n = 0
    elif num > 0:
    if max_p != 0:
    max_p *= num
    else:
    max_p = num
    zero = False
    min_n *= num # 如果前面没有负数,则还是0 如果前面有负数,那么最小的负数会变大
    else: # num < 0
    tmp = max_p
    max_p = num * min_n
    zero = False
    if tmp != 0:
    min_n = num * tmp
    else:
    min_n = num
    if zero:
    ans = max(ans, 0)
    elif max_p != 0:
    ans = max(ans, max_p)
    else:
    ans = max(ans, min_n)
    return ans
posted @   ouyangxx  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示