LeetCode 152 乘积最大子数组
题目
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
思路
动态规划问题,但是无法像最长连续子序列那样来处理。
在最长连续子序列
问题中,我们维护了以第i元素为结尾的最大连续自序列和
,那么我们在这个问题中,也维护一个以第i元素为结尾的最大连续自序列积maxD[i]
。
因为当前位置的最优解未必是由前一个位置的最优解转移得到的
,简单来说,由于序列种存在负数,那么会导致当前最大的乘积变最小的,最小的变最大的
。
因此还要维护以第i元素为结尾的最小连续自序列积minD[i]
,当更新本状态的maxD时,也要参考minD[i - 1] * A[i]
。
综上,在更新本状态时,一共有三种情况,maxD[i-1]*A[i]
,mind[i-1]*A[i]
,A[i]
。
记得输出maxD[i]的最大值。
代码
class Solution {
public:
int maxProduct(vector<int>& nums) {
vector<int> maxD(nums), minD(nums);
int maxt = nums[0];
for(int i = 1; i < nums.size(); i++){
maxD[i] = max(maxD[i-1] * nums[i], max(nums[i], minD[i-1] * nums[i]));
minD[i] = min(maxD[i-1] * nums[i], min(nums[i], minD[i-1] * nums[i]));
maxt = max(maxD[i], maxt);
}
return maxt;
}
};