近期一直忙着写paper,非常久没做题,一下子把题目搞复杂了。。思路理清楚了非常easy,每次仅仅需更新2个值:当前子序列最大乘积和当前子序列的最小乘积。最大乘积被更新有三种可能:当前A[i]>0,乘曾经面最大的数(>0),得到新的最大乘积;当前A[i]<0,乘曾经面最小的数(<0),得到新的最大乘积;A[i]它自己>0,(A[i-1]==0。最小乘积同理。。
class Solution { public: int Max(int a, int b, int c) { int max = -1 << 30; if (a >= b) max = a; else max = b; if (c > max) max = c; return max; } int Min(int a, int b, int c) { int min = 1 << 30; if (a <= b) min = a; else min = b; if (c < min) min = c; return min; } int maxProduct(int A[], int n) { int maxPPrev=A[0], maxP; int minPPrev = A[0], minP; int max = A[0]; for (int i = 1; i < n; i++) { maxP = Max(maxPPrev * A[i], minPPrev * A[i], A[i]); minP = Min(maxPPrev * A[i], minPPrev * A[i], A[i]); maxPPrev = maxP; minPPrev = minP; if (maxPPrev > max) max = maxPPrev; if (minPPrev > max) max = minPPrev; } return max; } };