给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
分析
如果要求不连续,把所有大于 0 的数字拿出来乘积
但是这里需要连续的
方法
1.暴力求解 递归
2.DP
DP 状态定义:DP[i] 从最开始下表为0的位置一直到i元素位置的product subarray的最大值
还要求DP[n-1],DP[n-2]…DP[0]
状态转移方程:DP[i+1]=DP[i] *a[i+1]
a[i+1]为正数则正确,a[i+1]为负值的时候则会出现负值
所以 a[i+1]为正数 maxDP[i]
a[i+1]为负数数 minDP[i]
所以在DP定义的时候需要两维度 另加一维度区分最大0最小1
新的状态转移方程为:
正的最大值DP[i,0]=
if a[i]>=0:
DP[i-1,0]*a[i]
else:
DP[i-1,1]*a[i]
负的最大值DP[i,1]=
if a[i]>=0:
DP[i-1,1]*a[i]
else:
DP[i-1,0]*a[i]
最后的值在DP[i,0] 求其中的max
代码实现
class Solution:
def maxProduct(self, nums: List[int]) -> int:
if nums is None:return 0
dp = [[0 for _ in range(2)] for _ in range(2)]
dp[0][1],dp[0][0],res = nums[0],nums[0],nums[0]
for i in range(1,len(nums)):
x,y = i % 2,(i-1) % 2 #滚动数组节省空间
dp[x][0] = max(dp[y][0]*nums[i],dp[y][1]*nums[i],nums[i])
dp[x][1] = min(dp[y][0]*nums[i],dp[y][1]*nums[i],nums[i])
res = max(res,dp[x][0])
return res