152. Maximum Product Subarray
Given an integer array nums, find the contiguous subarray within an array (containing at least one number) which has the largest product.
Example 1:
Input: [2,3,-2,4]
Output: 6
Explanation: [2,3] has the largest product 6.
Example 2:
Input: [-2,0,-1]
Output: 0
Explanation: The result cannot be 2, because [-2,-1] is not a subarray.
题意:
求取连续子序列对应的最大乘积
思路:
动态规划:
设
d
p
[
i
]
[
0
]
dp[i][0]
dp[i][0]表示包含第
i
i
i个数字时得到的最大正数乘积,
设
d
p
[
i
]
[
0
]
dp[i][0]
dp[i][0]表示包含第
i
i
i个数字时得到的最小负数乘积,
则根据
n
u
m
s
[
i
]
nums[i]
nums[i]的正负情况,
d
p
[
i
]
[
0
]
dp[i][0]
dp[i][0]可以由
d
p
[
i
−
1
]
[
0
]
dp[i-1][0]
dp[i−1][0]或者
d
p
[
i
−
1
]
[
1
]
dp[i-1][1]
dp[i−1][1]转化而来。转化过程见代码。
统计转化过程中最大的
d
p
[
i
]
[
0
]
dp[i][0]
dp[i][0]即可。
例子:
Input: [0,-1,2,-3]
dp[i][0]: 0,0,2,6
dp[i][1]: 0,-1,-2,-6
当nums长度为1时,直接输出nums[0]即可,不考虑转化
Input: [-2]
dp[i][0]: 0
dp[i][1]: -2
class Solution {
public:
//最大乘积子序列
//dp
int maxProduct(vector<int>& nums) {
if(nums.size()==1) return nums[0];
vector<vector<int>> dp(nums.size()+1,vector<int> (2,0));
int ans=INT_MIN;
for(int i=1;i<=nums.size();i++){
if(nums[i-1]>0){
if(dp[i-1][0])
dp[i][0]=dp[i-1][0]*nums[i-1];
else
dp[i][0]=nums[i-1];
if(dp[i-1][1])
dp[i][1]=dp[i-1][1]*nums[i-1];
else
dp[i][1]=0;
}
else if(nums[i-1]<0){
if(dp[i-1][1])
dp[i][0]=dp[i-1][1]*nums[i-1];
else
dp[i][0]=0;
if(dp[i-1][0])
dp[i][1]=dp[i-1][0]*nums[i-1];
else
dp[i][1]=nums[i-1];
}
else{
dp[i][0]=0;
dp[i][1]=0;
}
ans=max(ans,dp[i][0]);
}
return ans;
}
};