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 A; int Solve(int p,int q){ int l=p,r; int res=numeric_limits ::min(); for (int i=p;i=1){ int ln=1; for (int i=p;i=1){ int rn=1; for (int i=l+1;i A=vector (A,A+n); this->n=n; return Solve(0,n); }};