题解
思路
- 分类讨论
- 动态规划
代码
class Solution:
### 1219 分类讨论(44 ms,15.4 MB)
def maxProduct(self, nums: List[int]) -> int:
# 将数组逆序,用于处理负数个数为奇数的情况,即处理单出来的负数在开头还是结尾的情况(逆向累乘)
nums_reverse = nums[::-1]
# 从第二个数开始计算乘积
for i in range(1, len(nums)):
# or 1 表示若nums[i-1]为0时,nums[i]重新将自己作为子数组的第一个元素
nums[i] *= nums[i-1] or 1
nums_reverse[i] *= nums_reverse[i-1] or 1
return max(max(nums), max(nums_reverse)) # 最后返回:max(正向累乘中的最大累乘, 逆向累乘中的最大累乘)
### 1219 动态规划(44 ms,14.9 MB)
def maxProduct(self, nums: List[int]) -> int:
# 初始化:最大累乘max_accum为负无穷,第i个数的最大累乘imax为1,第i个数的最小累乘imin为1(维持两个最值)
max_accum, imax, imin = float('-inf'), 1, 1
# 对数组中的每一个数字计算累乘
for num in nums:
# 若当前数num为负数,则交换第i个数的最大累乘imax与最小累乘imin
if num < 0: imax, imin = imin, imax
# 根据当前数字num的情况来更新最大累乘imax与最小累乘imin
imax = max(imax*num, num)
imin = min(imin*num, num)
# 每个数计算完后更新最大累乘max_accum
max_accum = max(max_accum, imax)
return max_accum # 返回最大累乘max_accum