问题描述:
给你一个整数数组 nums
,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-product-subarray
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
解题思路:
这个和最大子序和有异曲同工之妙:最大子序和
这是最大子序和的动态方程
本题也是使用动态规划,不过乘积会出现负负得正的情况,因此我们需要统计俩个值,前部分的乘积的最大值,最小值
假设maxnum[i]代表从0-i的最大子序乘积
minnum[i]代表从0-i的最小子序乘积(主要是用了统计负值)
则动态方程可以写成:
完整代码如下:
class Solution {
public:
int maxProduct(vector<int>& nums) {
int minnum=1,maxnum=1;
int maxres = INT_MIN;
for(int i=0;i<nums.size();i++){
int aa = minnum*nums[i];
int bb = maxnum*nums[i];
minnum = min({nums[i],aa,bb});
maxnum = max({nums[i],aa,bb});
maxres = max(maxres,maxnum);
}
return maxres;
}
};