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; } };