给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
思路:
采用动态规划的思想。因为是乘法,可能出现负负为正的情况。因此需要维护两个变量,maxP和minP分别代表当前最大值和最小值,因为最小值可能是负如果下一个数还是负数,那么maxP可能为minPnums[i]。因此写出动态转移方程,maxP=max(max(nums[i]maxP,nums[i]),minPnums[i]),minP=min(min(maxnums[i],nums[i]),minP*nums[i])。遍历应该从i+1开始。
class Solution {
public:
int maxProduct(vector<int>& nums) {
int n=nums.size();
if(n==0)
return 0;
if(n==1)
return nums[0];
int res=nums[0];
int maxP=nums[0];
int minP=nums[0];
for(int i=1;i<n;++i){
int tmp=maxP;
maxP=max(max(maxP*nums[i],nums[i]),minP*nums[i]);
minP=min(min(tmp*nums[i],nums[i]),minP*nums[i]);
res=max(maxP,res);
}
return res;
}
};