問題描述
給你一個整數數組 nums ,請你找出數組中乘積最大的連續子數組(該子數組中至少包含一個數字)。
示例 1:
輸入: [2,3,-2,4]
輸出: 6
解釋: 子數組 [2,3] 有最大乘積 6。
解題報告
這道題需要注意的點有兩個:
- 在遇到一個負數時,當前累計乘積的最小值就會變成當前乘積的最大值,而當前累計乘積的最大值會變成最小值,所以本題不僅需要記錄當前累計乘積的最大值,還要記錄當前累計乘積的最小值。
- 求當前乘積的最大值時,什麼時候開始新的起點呢?噹噹前乘積的最大值與當前元素的乘積比當前元素還要小時,就要開始新的起點了【這一點和
Leetcode 53. 最大子序和
非常相似】。求當前累計乘積的最小值同樣的操作。
實現代碼
class Solution {
public:
int maxProduct(vector<int>&nums) {
int ans= INT_MIN, max_= 1, min_ = 1;
for(int i=0; i<nums.size(); i++){
// 這一步是爲了維持當前累計乘積的最大值和最小值
if(nums[i] < 0) swap(max_, min_);
// 這一步是決定是否重新新的起點
max_= max(max_*nums[i], nums[i]);
min_= min(min_*nums[i], nums[i]);
ans= max(ans, max_);
}
return ans;
}
};