JavaScript:leetcode_152. 乘積最大子數組(動態規劃)

題目說明

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

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

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

解題思路一

  1. 該題與之前所寫的560.和爲K的子數組很相似,解法也都是一樣的。
  2. 依舊是對前綴進行操作。不同的是,我們這次不需要保留所有的結果,只需要保留本次結果的最大值nowMax 和最小值nowMin 。取min主要是爲了複數的情況。
  3. 我們依賴於上一次的狀態,求出本次的最大最小值。然後傳入下一次狀態。
    1. nowMax = Math.max(res[0] * nums[i], res[1] * nums[i], nums[i]);
    2. nowMin = Math.min(res[0] * nums[i], res[1] * nums[i], nums[i]);
    3. res = [nowMax, nowMin ]
  4. 在此過程中我們可以求出最大值max

代碼實現一

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxProduct = function(nums) {
    if (!nums.length) {
        return 0;
    }
    let max = nums[0]
    let min = nums[0]
    let res = [nums[0], nums[0]];
    for (let i = 1 ; i < nums.length; i++) {
        let nowMax = Math.max(res[0] * nums[i], res[1] * nums[i], nums[i]);
        let nowMin = Math.min(res[0] * nums[i], res[1] * nums[i], nums[i]);
        max = Math.max(nowMax, max);
        // min = Math.min(nowMin, min);
        res = [nowMax, nowMin];
    }
    return max;
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章