题目
思考
特殊在于,数组元素可能是0或者是负数。
当遇到负数的时候,最大值和最小值间会出现翻转,
即:最大值会变成最小值,最小值会变成最大值
维护两个数组
dpmin[i]:存储以元素[i]为结尾的连续一段的最大值
dpmax[i]:存储以元素[i]为结尾的连续一段的最小值
每次遍历都要 res=max(res,dpmax[i])
类型归类
我把这种题目归类为,
求一组数某一连续范围的最大值/最小值问题
解法:
通常维护的dp数组的每个元素dp[i]要以第i个元素作为结尾
然后要求最大/最小,最后要遍历整个dp数组取最大/最小,或者在遍历的时候维护min和max变量
代码
class Solution {
public:
int maxProduct(vector<int>& nums) {
int res=nums[0];
vector<int> dpmin(nums.size());
vector<int> dpmax(nums.size());
dpmin[0]=dpmax[0]=nums[0];
for(int i=1;i<nums.size();i++){
dpmin[i]=min(min(dpmin[i-1]*nums[i],dpmax[i-1]*nums[i]),nums[i]);
dpmax[i]=max(max(dpmin[i-1]*nums[i],dpmax[i-1]*nums[i]),nums[i]);
res=max(res,dpmax[i]);
}
return res;
}
};