要求是连续的子数组,动态规划但是要考虑负数的情况,所以需要维护当前最大值,最小值。
乘积最大子数组 - 乘积最大子数组 - 力扣(LeetCode)
class Solution {
public:
int maxProduct(vector<int>& nums) {
int n = nums.size();
vector<int> maxf(nums), minf(nums);
for(int i = 1; i < n; ++i){
maxf[i] = max(maxf[i-1] * nums[i], max(nums[i], minf[i-1] * nums[i]));
minf[i] = min(minf[i-1] * nums[i], min(nums[i], maxf[i-1] * nums[i]));
}
return *max_element(maxf.begin(), maxf.end());
}
};
优化:
class Solution {
public:
int maxProduct(vector<int>& nums) {
int n = nums.size();
int res = nums[0];
int maxf = nums[0], minf = nums[0];
for(int i = 1; i < n; ++i){
int mx = maxf, mn = minf; //临时变量
maxf = max(mx * nums[i], max(nums[i], mn * nums[i]));//三者取最大
minf = min(mn * nums[i], min(nums[i], mx * nums[i]));//三者取最小
res = max(res, maxf);
}
return res;
}
};