ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

元宝 LeetCode 152. 乘积最大子数组 Python3实现

元宝    LeetCode 152. 乘积最大子数组 Python3实现 这道题是动态规划的经典题核心在于乘积会因为负数发生符号翻转所以必须同时维护「最大乘积」和「最小乘积」。下面给你一个注释详细、可直接运行的 Python3 实现并附带一个更简洁的写法。✅ 解法一动态规划标准写法推荐from typing import Listclass Solution:def maxProduct(self, nums: List[int]) - int:if not nums:return 0# imax: 以当前元素结尾的子数组的最大乘积 # imin: 以当前元素结尾的子数组的最小乘积 imax, imin nums[0], nums[0] ans nums[0] for i in range(1, len(nums)): x nums[i] # 关键如果当前数是负数乘以后会反转大小关系 # 所以先把 imax 和 imin 交换 if x 0: imax, imin imin, imax # 要么从当前数重新开始要么乘上之前的结果 imax max(x, imax * x) imin min(x, imin * x) # 更新全局最大值 ans max(ans, imax) return ans 为什么这样写是对的场景 处理方式当前数“x 0” 最大值继续乘会更大最小值继续乘会更小无需交换当前数“x 0” 最大值乘负变最小最小值乘负变最大所以先交换遇到“0”“imax” 和“imin” 都会变成“0”相当于子数组从此处断裂重启是否重新开始“max(x, imax * x)” 允许子数组从当前元素单独起步✅ 解法二更简洁的写法逻辑相同def maxProduct(nums):imax imin ans nums[0]for x in nums[1:]:if x 0:imax, imin imin, imaximax max(x, imax * x)imin min(x, imin * x)ans max(ans, imax)return ans✅ 完整测试代码可直接复制运行from typing import Listclass Solution:def maxProduct(self, nums: List[int]) - int:imax imin ans nums[0]for i in range(1, len(nums)):x nums[i]if x 0:imax, imin imin, imaximax max(x, imax * x)imin min(x, imin * x)ans max(ans, imax)return ans测试ifname “main”:sol Solution()test_cases [[2, 3, -2, 4], # 期望输出: 6[-2, 0, -1], # 期望输出: 0[-2, 3, -4], # 期望输出: 24[-1], # 期望输出: -1[0, 2, 0, 3, 4], # 期望输出: 12[-4, -3, -2], # 期望输出: 12]for nums in test_cases: result sol.maxProduct(nums) print(f输入: {nums} - 输出: {result}) 复杂度分析指标 数值时间复杂度 O(n) — 仅遍历数组一次空间复杂度 O(1) — 只用了常数个变量 一句话总结乘积最大子数组 同时维护最大/最小乘积 遇到负数交换 允许从当前元素重启如果你想要分治解法或前缀积/后缀积解法我也可以补充
返回列表