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
.
解决方案:
可用动态规划来做,令a[i]表示第i个数,max[i]表示以a[i]为尾的连续子数组乘积的最大值,min[i]表示以a[i]为尾的连续子数组乘积的最小值,max[0]=min[0]=1,转移公式为:
max[i]=Max{max[i-1]*a[i], min[i-1]*a[i], a[i]};
min[i]=Min{max[i-1]*a[i], min[i-1]*a[i], a[i]}.
整个数组的最大连续乘积即为max[i]中的最大值。
具体代码如下:
class Solution {
public:
int maxProduct(vector<int>& nums) {
int i;
int result;
int n=nums.size();
int *max=new int[n+1];
int *min=new int[n+1];
max[0]=1;
min[0]=1;
result=nums[0];
for(i=1;i<=n;i++)
{
max[i]=Max(Max(max[i-1]*nums[i-1],nums[i-1]),min[i-1]*nums[i-1]);
min[i]=Min(Min(max[i-1]*nums[i-1],nums[i-1]),min[i-1]*nums[i-1]);
result=Max(result,max[i]);
}
delete []max;
delete []min;
return result;
}
int Max(int a,int b){
return a>b?a:b;
}
int Min(int a,int b){
return a<b?a:b;
}
};