Leetcode 152. 乘積最大子數組【動態規劃】

問題描述

給你一個整數數組 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;
    }
};

參考資料

[1] Leetcode 152. 乘積最大子數組

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章