LeetCode-Maximum Product Subarray-最大乘积子数组-情况判断
https://oj.leetcode.com/problems/maximum-product-subarray/
题目非常简单,就是要AC代码量不小,需要保证一次性正确率很难。
考虑一个数组最大乘积可能的几种情况:
1)0,数组中有0,且其他部分都乘积比0小。这种情况可以把问题分解成一系列0隔开的子数组的最大乘积,再考虑上0.
2)非零,数组中有偶数个负数,则全乘起来比较大。
3)非零,数组中有奇数个负数,这时最大乘积有两种情况:最左边的负数+1到最右边,最左边到最右边负数-1。
其实可以不使用递归,就手动扫描分割出不含0的子数组。
class Solution { public: int m,n; vector <int> A; int Solve(int p,int q){ int l=p,r; int res=numeric_limits<int>::min(); for (int i=p;i<q;i++){ //split by 0 if (A[i]==0){ res=max(res,0); res=max(res,Solve(l,i)); l=i+1; continue; } } p=l; if (q-p<1){return res;} int count=0; int an=1; l=n; r=0; for (int i=p;i<q;i++){ if (A[i]<0){ count++; l=min(l,i); r=max(r,i); } an*=A[i]; } res=max(res,an); if (count%2==0){return res;} //product is positive res=max(res,A[l]); res=max(res,A[r]); if (r-p>=1){ int ln=1; for (int i=p;i<r;i++){ ln*=A[i]; } res=max(res,ln); } if (q-l-1>=1){ int rn=1; for (int i=l+1;i<q;i++){ rn*=A[i]; } res=max(res,rn); } return res; } int maxProduct(int A[], int n) { this->A=vector<int>(A,A+n); this->n=n; return Solve(0,n); } };