这个题解采用了动态规划的思路。它从左到右遍历数组,用一个变量 multi 记录当前连续子数组的乘积,同时用 ans 记录遇到的最大乘积。当遇到 0 时,multi 会重置为 1。然后再从右到左遍历一遍数组,同样更新 multi 和 ans,最后返回 ans 即可得到乘积最大子数组的乘积。这样可以同时处理负数的情况。
时间复杂度: O(n)
空间复杂度: O(1)
class Solution:
def maxProduct(self, nums: List[int]) -> int:
ans = max(nums) # 初始化 ans 为数组中的最大值
multi = 1 # 初始化当前连续子数组的乘积为 1
# 从左到右遍历数组
for i in range(len(nums)):
if nums[i] == 0:
multi = 1 # 如果遇到 0,重置 multi 为 1
else:
multi = multi * nums[i] # 更新当前连续子数组的乘积
ans = max(multi, ans) # 更新最大乘积
multi = 1 # 重置 multi 为 1
# 从右到左遍历数组
for i in range(len(nums)-1, -1, -1):
if nums[i] == 0:
multi = 1 # 如果遇到 0,重置 multi 为 1
else:
multi = multi * nums[i] # 更新当前连续子数组的乘积
ans = max(multi, ans) # 更新最大乘积
return ans