题目:
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
.
思路:在《数组的最大子数组和》问题中,有一个很好的方法,一次遍历就能求得结果。本问题和它非常类似,一个是考察子数组的和,一个是考察子数组的积。在最大子数组和问题中,当子数组和累积为负数的时候则需要舍去之前的部分,因为负数可以看做是“拖累”。而在最大子数组积问题中则不是这样,因为负数*负数可以变回正数,因此不能因为子数组积累计为负数就将其舍去,一个符号的差别可以将最小转变为最大。因此在一次遍历的过程中,可以同时记录着最小和最大。
class Solution {
public:
int getmax(int a, int b, int c)
{
int m = a>b?a:b;
return m>c?m:c;
}
int getmin(int a, int b, int c)
{
int m = a<b?a:b;
return m<c?m:c;
}
int maxProduct(int A[], int n)
{
int max, tmpmax, tmpmin;
max = tmpmax = tmpmin = A[0];
for(int i=1;i<n;i++)
{
int tmin = tmpmin; //tmin、tmin临时用,以免两次求最值时丢失原值。
int tmax = tmpmax;
tmpmin = getmin(tmax*A[i], tmin*A[i], A[i]);
tmpmax = getmax(tmin*A[i], tmax*A[i], A[i]);
if(max < tmpmax)
max = tmpmax;
}
return max;
}
};