题目描述:
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
解题分析:
由于存在负数*负数取得最大值得情况,所以维护一个minProductVec,记录负数。状态方程为:
maxProductVec[i]=max(maxProductVec[i-1]*nums[i-1], max(minProductVec[i-1]*nums[i-1], nums[i-1]));
minProductVec[i]=min(minProductVec[i-1]*nums[i-1], min(maxProductVec[i-1]*nums[i-1], nums[i-1]));
class Solution {
public:
int maxProduct(vector<int>& nums) {
if(nums.size()==0)
return 0;
int numsSize=nums.size();
vector<int> maxProductVec(numsSize+1,1);
vector<int> minProductVec(numsSize+1,1);
int maxProduct=nums[0];
for(int i=1; i<=numsSize; ++i){
maxProductVec[i]=max(maxProductVec[i-1]*nums[i-1], max(minProductVec[i-1]*nums[i-1], nums[i-1]));
minProductVec[i]=min(minProductVec[i-1]*nums[i-1], min(maxProductVec[i-1]*nums[i-1], nums[i-1]));
maxProduct=max(maxProduct, maxProductVec[i]);
}
return maxProduct;
}
};
动态规划解决最大乘积子数组问题
该博客讨论了一种动态规划的方法来找到整数数组中乘积最大的连续子数组。通过维护两个状态变量`maxProductVec`和`minProductVec`,分别存储到当前位置为止的最大乘积和最小乘积,从而有效地处理正负数的情况。在遍历数组的过程中,不断更新这两个状态变量,并最终返回`maxProductVec`中的最大值作为结果。
483

被折叠的 条评论
为什么被折叠?



