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
.
分析:
题目是求连续子数组的最大乘积。
用动态规划来做‘
在做连续子数组的最大和的时候我们是要记录此时的最大值,然后如果为负数就更新成此时数组的下标,不然就要累加进去
int sum = a[0];
int max = sum;
for(int i=1;i<n;i++)
{
if(sum<=0)
sum=a[i];
else
sum += a[i];
if(max <= sum)
max = sum;
}
return max;
可是如果是相乘的话就不能这么做了,因为有可能一个负数乘以一个负数之后就变成了一个整数,这样就不能保证谁是最大值了。
这样再思考的话,就可以大概能想出思路了,当遇到一个正数,那么肯定一个正数的最大值相乘是最大的,如果遇到一个负数那么负数的最小值相乘就是最大的了,所以我们可以保留两个值,一个最大值,一个最小值,最后取一个最大的,就是要求的答案
int maxProduct(int A[], int n)
{
int min_A=A[0];
int max_A=A[0];
int temp = A[0];
int result = max_A;
for(int i=1;i<n;i++)
{
temp=min_A*A[i];
min_A = min(A[i],min(temp,max_A*A[i]));
max_A = max(A[i],max(temp,max_A*A[i]));
result = max(result,max_A);
}
return result;
}