152. 乘积最大子数组
-
[题目链接](152. 乘积最大子数组 - 力扣(LeetCode))
-
解题思路:子数组问题,考虑【以i结尾】结果是什么,求出所有的结果,最大的那个就是结果。
- 【以i结尾】结果是什么?我们可以利用【i-1】计算过的内容。
nums[i]
如果是0,那么结果就是0nums[i]
如果大于0,那么我们就希望得到【以i-1结尾】的最大的连续正数是什么nums[i]
如果小于0,那么我们就希望得到【以i-1结尾】的最大的连续负数是什么- 只要维持上述的内容,就可以得到全部【以i结尾】的结果
- 【以i结尾】结果是什么?我们可以利用【i-1】计算过的内容。
-
代码
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
标签:
leetcode刷题
, 数据结构与算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理