动态规划之三乘积最大子数组
题目描述:给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
示例 1:
输入: [2,3,-2,4] 输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1] 输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
解题思路
:
这一题和最大子数组和不同的地方在于,加法只要累加就可以找到最大和,但是乘法会出现负负得正的场景。所以,当一个负数 × 负数的最小值,就能得到一个最大值。为了解决这种问题,需要同时记录最大值和最小值,最大值遇到负数会变成最小值,最小值遇到负数会变成最大值。
同时该题并不需要维护一个dp数组,因为最大值乘积是一个数值,并且这个数值只和当前数值与前一个最大值和最小值有关,所以维护一个最大值和一个最小值就能够完成求解。
def max_multiply(arr):
max_value = arr[0]
min_value = arr[0]
res = arr[0]
for i in arr[1:]:
pre_max = max_value
# 先求出最大值,再和当前值比较,找到最大值
max_value = max(i, max(i*max_value,i*min_value))
# 先求出最小值,在和当前值比较,找到最小值
min_value = min(i, min(i*pre_max,i*min_value))
res = max(max_value,res)
return res
arr = [5,6,-3,4,-3]
res = max_multiply(arr)
print(res)