class Solution { public: int maxProduct(int A[], int n) { if (A == NULL || n < 1) { return INT_MIN; } int res = INT_MIN; int tr = 1; for (int i=0; i<n; i++) { tr = tr * A[i]; if (tr > res) { res = tr; } if (tr == 0) { tr = 1; } } tr = 1; for (int i=n-1; i>=0; i--) { tr = tr * A[i]; if (tr > res) { res = tr; } if (tr == 0) { tr = 1; } } return res; } };
更叼的方法,不过速度上没有明显提升
class Solution { public: int maxProduct(int A[], int n) { // store the result that is the max we have found so far int r = A[0]; // imax/imin stores the max/min product of // subarray that ends with the current number A[i] for (int i = 1, imax = r, imin = r; i < n; i++) { // multiplied by a negative makes big number smaller, small number bigger // so we redefine the extremums by swapping them if (A[i] < 0) swap(imax, imin); // max/min product for the current number is either the current number itself // or the max/min by the previous number times the current one imax = max(A[i], imax * A[i]); imin = min(A[i], imin * A[i]); // the newly computed max value is a candidate for our global result r = max(r, imax); } return r; } };
第二轮:
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 maxProduct(int A[], int n) { int maxv = A[0]; int minv = A[0]; int maxt = A[0]; for (int i=1; i<n; i++) { int mxv = maxv; int miv = minv; maxv = max(max(mxv * A[i], miv * A[i]), A[i]); minv = min(min(miv * A[i], mxv * A[i]), A[i]); maxt = max(maxv, maxt); } return maxt; } };