LeetCode系列6:求乘積最大子數組

題目

給你一個整數數組 nums ,請你找出數組中乘積最大的連續子數組(該子數組中至少包含一個數字),並返回該子數組所對應的乘積。

示例 1:

輸入: [2,3,-2,4]
輸出: 6
解釋: 子數組 [2,3] 有最大乘積 6。
示例 2:

輸入: [-2,0,-1]
輸出: 0
解釋: 結果不能爲 2, 因爲 [-2,-1] 不是子數組。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/maximum-product-subarray
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

解題思路

  • 解法1,暴力破解法:通過增加輔助變量,將數組的所有子串查找出來,然後再逐個計算乘機。時間複雜度O(n^2),在leetcode上超時。
  • 解法2,動態規劃,參考大神解法,遍歷數組時計算當前最大值,不斷更新,令imax爲當前最大值,則當前最大值爲 imax = max(imax * nums[i], nums[i]),由於存在負數,那麼會導致最大的變最小的,最小的變最大的。因此還需要維護當前最小值imin,imin = min(imin * nums[i], nums[i]),當負數出現時則imax與imin進行交換再進行下一步計算,時間複雜度:O(n)O(n)

核心代碼

class Solution {
public:
   int maxProduct(vector<int>& nums) {  
        int intTemp = 0;
        int intMax = 1;
        int intMin = 1; 
        if (nums.size() == 1)
        {
            return nums[0];
        }
        for (int i = 0; i < nums.size(); i++)
        {
            if (nums[i] < 0)
            {
                int intT = intMax;
                intMax = intMin;
                intMin = intT;
            }
            intMax = max(intMax * nums[i], nums[i]);
            intMin = min(intMin * nums[i], nums[i]); 
            intTemp = max(intMax, intTemp);
        }
        return intTemp;
    }
};

在這裏插入圖片描述

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