地址:https://oj.leetcode.com/problems/maximum-product-subarray/
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
.
要特别注意数组里的0,因为0可能会使你的结果功亏一篑。
1. 用0把array分成许多subarray,计算每个subarray的乘积最大值
2. 计算每个subarray中负数的个数,并对负数的个数分类讨论
a) 负数个数为偶数,直接乘上所有数即是乘积最大值
b) 负数个数为奇数,
如果是1个负数,那个这个负数左边的部分和右边的部分两乘积取较大值即可。
如是多于1个负数,那么最大值应该是max(开始到最后1个负数前一个位置数的乘积, 第一个负数后一个位置到数组末尾乘积)
感觉逻辑这么复杂,应该有更好的解法方法。好久没练,手感欠佳。。。
C++ 参考代码:
class Solution {
private:
int maxSubProduct(int A[], int n) {
if(n<=0)
return n;
else if(n==1)
return A[0];
vector<int>vec;
for(int i = 0; i<n; ++i)
if(A[i]<0)
vec.push_back(i);
int ans = 1, tag = 0, tmp = 1;
if(vec.size() & 0x01) { //odd
if(vec.size()==1) {
for(int i = 0; i<vec[0]; ++i) {
ans *= A[i];
}
for(int i = vec[0]+1; i<n; ++i) {
tmp *= A[i];
}
if(tmp != 1)
ans = max(ans, tmp);
}else {
for(int i = 0; i<=vec[vec.size()-1]-1; ++i)
ans *= A[i];
for(int i = vec[0]+1; i<n; ++i)
tmp *= A[i];
ans = max(ans, tmp);
}
}else { //even
for(int i = 0; i<n; ++i)
ans *= A[i];
}
return ans;
}
public:
int maxProduct(int A[], int n) {
int begin = 0, ans = A[0];
int i = 0;
while(i<=n) {
if(i==n) {
ans = max(ans, maxSubProduct(A+begin, i-begin));
break;
}
if(!A[i] && i<n) {
ans = max(0, max(ans, maxSubProduct(A+begin, i-begin)));
begin = ++i;
} else
++i;
}
return ans;
}
};