📅  最后修改于: 2023-12-03 15:26:24.647000             🧑  作者: Mango
在给定的数组中,找到连续的子数组,使得子数组中所有元素的乘积最大,返回该最大乘积。
动态规划,记录数组中以每个元素结尾的最大、最小乘积。
设当前元素为 $nums[i]$:
最终结果为所有以 $nums[i]$ 结尾的最大乘积的最大值。
def maxProduct(nums: List[int]) -> int:
n = len(nums)
if n == 0:
return 0
if n == 1:
return nums[0]
# 初始化最大、最小乘积
max_product = [0] * n
min_product = [0] * n
max_product[0] = nums[0]
min_product[0] = nums[0]
for i in range(1, n):
# 计算以 nums[i] 结尾的最大、最小乘积
if nums[i] > 0:
max_product[i] = max(max_product[i-1]*nums[i], nums[i])
min_product[i] = min(min_product[i-1]*nums[i], nums[i])
elif nums[i] < 0:
max_product[i] = max(min_product[i-1]*nums[i], nums[i])
min_product[i] = min(max_product[i-1]*nums[i], nums[i])
else:
max_product[i] = min_product[i] = 0
return max(max_product)
输入:
nums = [2,3,-2,4]
print(maxProduct(nums)) # output: 6
解释:最大乘积子数组为 [2, 3],乘积为 6。