152. Maximum Product Subarray
Medium
159373FavoriteShare
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.
超级慢解法:(慢的原因是加入了cin cout)
两个dp 分别存储正数,负数,一个个遍历。去掉
class Solution {
public:
int maxProduct(vector<int>& nums)
{
int ans=nums[0];
if(nums.size()==0)
{
return 0;
}
if(nums.size()==1)
{
return nums[0];
}
vector<int> dp_positive(nums.size()+1,0);//最终答案
vector<int> dp_negative(nums.size()+1,0);//暂时存放负数最大的
//第一个数单独处理
if(nums[0]>=0)
{
dp_positive[1]=nums[0];
}
else
{
dp_negative[1]=nums[0];
}
for(int i=2;i<=nums.size();i++)
{
if(nums[i-1]==0)
{
dp_positive[i]=dp_negative[i]=0;
if(dp_positive[i]>=ans)ans=dp_positive[i];
}
else if(nums[i-1]>0)
{
dp_negative[i]=dp_negative[i-1]*nums[i-1];
if(dp_positive[i-1]==0)
{
//dp_positive[i]=dp_positive[i-1]*nums[i-1];
dp_positive[i]=nums[i-1];
}
else
{
dp_positive[i]=dp_positive[i-1]*nums[i-1];
}
if(dp_positive[i]>=ans)ans=dp_positive[i];
}
else
{
dp_positive[i]=dp_negative[i-1]*nums[i-1];
if(dp_positive[i-1]==0)
{
dp_negative[i]=nums[i-1];
}
else
{
dp_negative[i]=dp_positive[i-1]*nums[i-1];
}
if(dp_positive[i]>=ans)ans=dp_positive[i];
}
cout<<"dp_positive"<<i<<":"<<dp_positive[i]<<endl;
cout<<"dp_negative"<<i<<":"<<dp_negative[i]<<endl;
cout<<ans<<endl;
}
return ans;
}
};
超级慢解法2 上一般的改进
class Solution {
public:
int maxProduct(vector<int>& nums)
{
int ans=nums[0];
if(nums.size()==0)
{
return 0;
}
if(nums.size()==1)
{
return nums[0];
}
vector<int> dp_max(nums.size()+1);//最终答案
vector<int> dp_min(nums.size()+1);//暂时存放负数最大的
//第一个数单独处理
dp_max[1]=dp_min[1]=nums[0];
for(int i=2;i<=nums.size();i++)
{
int t1 = dp_max[i-1]*nums[i-1];
int t2 = dp_min[i-1]*nums[i-1];
dp_max[i]=max(max(t1,t2),nums[i-1]);
dp_min[i]=min(min(t1,t2),nums[i-1]);
ans=(ans>dp_max[i])?ans:dp_max[i];
cout<<"dp_max"<<i<<":"<<dp_max[i]<<endl;
cout<<"dp_min"<<i<<":"<<dp_min[i]<<endl;
cout<<ans<<endl;
}
return ans;
}
};