这题如果没有负数和0,答案就很简单了,所有数的乘积。有负数和0就要复杂一些。
-
先考虑只有正数和负数而没有 0 的情况:
- 负数是偶数个。答案也很简单,所有数的乘积。
- 负数是奇数个。那就要枚举这个负数位置,将序列分成两部分,取乘积大的那部分。
-
然后再考虑数据中有 0 的情况,这时我们可以将整个序列以 0 进行分割成多个子序列,每个子序列的处理和情况 1 一样。
class Solution {
public:
int noZero(int A[], int start, int end) { // 没有 0 的子序列
int ans = A[start], left = 1, right = 1, negCnt = 0;
for(int i = start; i <= end; ++i) {
right *= A[i];
if(A[i] < 0) {
negCnt++; // 计数负数的个数
}
}
if(negCnt&1) { // 奇数个负数
for(int i = start; i < end; ++i) {
left *= A[i];
right /= A[i];
ans = max(max(left, right), ans);
}
} else { // 偶数个负数
ans = right;
}
return ans;
}
int maxProduct(int A[], int n) {
int ans = A[0], start = 0, end = 0, i = 0, hasZero = 0;
while(i < n) {
while(i < n && A[i] == 0) {
i++;
hasZero = 1; // 标记数据中有 0
}
start = i;
while(i < n && A[i] != 0) {
i++;
}
end = i - 1;
if(end >= start) {
// 以 0 分割成多个子串
int tmp = noZero(A, start, end);
if(tmp > ans) {
ans = tmp;
}
}
}
if(hasZero && ans < 0) {
ans = 0;
}
return ans;
}
};