题目大意:给出一个数组,求出乘积最大的连续子数组
分析:动规。
乘法和加法的不同之处在于它的符号问题能够造成很大影响,如果当前数为负数,乘上之前的最小数会变为最大数,而当前数是正数时,乘之前的最大数才是最大数,所以在求解时要维护两方面的dp状态,一个是之前的最大值,一个是之前的最小值,由此得出全局最大值。
dpMax[i] = max(nums[i], max(dpMax[i-1]*nums[i], dpMin[i-1]*nums[i]));
dpMin[i] = min(nums[i], min(dpMax[i-1]*nums[i], dpMin[i-1]*nums[i]));
空间优化了,可以配合leetcode309一起看,也是空间优化。
代码:
class Solution {
public:
int maxProduct(vector<int>& nums) {
int maxAll = nums[0],maxLast = nums[0],minLast = nums[0];
int maxCur,minCur;
for(int i = 1;i < nums.size();i++){
maxCur = max(nums[i], max(maxLast*nums[i], minLast*nums[i]));
minCur = min(nums[i], min(maxLast*nums[i], minLast*nums[i]));
maxLast = maxCur;
minLast = minCur;
maxAll = max(maxAll, maxCur);
}
return maxAll;
}
};