一.题目介绍
二.求乘积类型子数组的分析
如题目所述求子数组乘积的最大值,因为乘法中负数 * 负数等于正数,所以我们不能确定 i 位置的数是正是负,也不能确定0~i-1 位置中的乘积是正是负,所以单一的状态是无法分析得到结果的,因此我们在分析状态时不仅要记录最大乘积和,也要记录最小乘积和。
三.状态分析
这里最小子数组乘积和g[i]存在的意义就是在 i位置不知道正负的情况下辅助最大子数组乘积和f[i]的更新,这样列出的状态方程才符合题意。
四.完整代码
int maxProduct(vector<int>& nums)
{
int n = nums.size();
int res = nums[0]; //这种初始化可以避免nums只有单个元素的条件
vector<int> f(n), g(n);
f[0] = g[0] = nums[0];
for(int i = 1; i < n; i++)
{
int x = nums[i];
int tmp_max = max(x, x * f[i-1]);
f[i] = max(tmp_max, x * g[i-1]);
int tmp_min = min(x, x * g[i-1]);
g[i] = min(tmp_min, x * f[i-1]);
res = max(res, f[i]);
}
return res;
}