思路
数组中有负有正有0
状态表示
f[i] : 表示从[0, i]数组乘积的最大值
g[i] : 表示从[0, i]数组乘积的最小值
状态计算
通过i-1的状态递推i
对于f[i]
- f[i]只考虑自己,则f[i] = nums[i]
- nums[i] > 0 f[i] = f[i - 1] * nums[i]
- nums[i] < 0 f[i] = g[i - 1] * nums[i]
- nums[i] == 0
- 综上f[i]是上面几种情况的最大值
对于g[i]
- g[i]只考虑自己,则g[i] = nums[i]
- nums[i] > 0 f[i] = g[i - 1] * nums[i]
- nums[i] < 0 f[i] = f[i - 1] * nums[i]
- nums[i] == 0
- 综上f[i]是上面几种情况的最小值
代码
class Solution {
public:
int maxProduct(vector<int>& nums) {
int f = nums[0];
int g = nums[0];
int ans = nums[0];
int n = nums.size();
for (int i = 1; i < n; i++) {
int a = nums[i];
int nf = f * a;
int ng = g * a;
f = max(a, max(nf, ng));
g = min(a, min(nf, ng));
ans = max(ans, f);
}
return ans;
}
};