問題描述:
給你一個整數數組 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;
}
};