题目描述:
Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array [2,3,-2,4]
,
the contiguous subarray [2,3]
has the largest product = 6
.
求最大子串积,采用动态规划。由于存在负数,最小的负数乘负数也可以是最大的正数,最大的正数乘负数也可以是最小的负数,所以必须维护两个数组dp_max和dp_min才能求出当前最大子串积。递推关系为:dp_max[i-1]=max(nums[i],nums[i]*dp_max[i-1],nums[i]*dp_min[i-1]),dp_min[i]=min(nums[i],nums[i]*dp_max[i-1],nums[i]*dp_min[i-1])。
class Solution {
public:
int maxProduct(vector<int>& nums) {
vector<int> dp_max(nums.size(),1);
vector<int> dp_min(nums.size(),1);
dp_max[0]=nums[0];
dp_min[0]=nums[0];
for(int i=1;i<nums.size();i++)
{
dp_max[i]=max(max(dp_max[i-1]*nums[i],dp_min[i-1]*nums[i]),nums[i]);
dp_min[i]=min(min(dp_max[i-1]*nums[i],dp_min[i-1]*nums[i]),nums[i]);
}
int result=INT_MIN;
for(int i=0;i<dp_max.size();i++)
{
result=max(result,dp_max[i]);
}
return result;
}
};