LeetCode 152題 乘積最大子串行

2021-09-29 16:44:03 字數 1444 閱讀 9616

示例 :

輸入: [2,3,-2,4]

輸出: 6

解釋: 子陣列 [2,3] 有最大乘積 6,返回為6。

思路: 動態規劃:

定義陣列 dpmax[i] 表示以第i個元素結尾的子陣列中乘積最大的值,這個陣列必須包含第i個元素

對於 dpmax[i] 有三種取值:

1. nums[i] >= 0 且 dpmax[i-1] > 0 , 則 dpmax[i] = dpmax[i-1] * nums[i]

2. nums[i] >= 0 且dpmax[i-1] < 0,如果和前邊的數累乘,會變成負數,所以dpmax[i] = nums[i]

3. nums[i] < 0,如果前邊累乘結果是乙個很小的負數,那麼和當前負數累乘的話就會變成乙個很大的正數。

所以還需要乙個陣列 dpmin 來記錄以第 i 個元素結尾的子陣列中乘積最小的值。

dpmin[i-1] < 0 時, dpmax[i] = dpmin[i-1] * nums[i]

dpmin[i-1] >= 0 時,dpmax[i] = nums[i]

注意到上邊 dpmax[i] 的取值無非就是三種,dpmax[i-1] * nums[i]、dpmin[i-1] * nums[i] 以及 nums[i]。所以:

dpmax[i] = max(dpmax[i-1] * nums[i], dpmin[i-1] * nums[i], nums[i]);

同理可得:

dpmin[i] = min(dpmax[i-1] * nums[i], dpmin[i-1] * nums[i], nums[i]);

public

class

lc152

int[

] dpmax =

newint

[nums.length]

; dpmax[0]

= nums[0]

;int

dpmin =

newint

[nums.length]

; dpmin[0]

= nums[0]

;int max = nums[0]

;for

(int i =

1; i < nums.length; i++

)return max;

}//dp空間優化

public

intmaxproduct2

(int

nums)

int dpmax = nums[0]

;int dpmin = nums[0]

;int max = nums[0]

;for

(int i =

1; i < nums.length; i++

)return max;

}}

Leetcode 152 乘積最大子串行

原題描述 找出乙個序列中乘積最大的連續子串行 該序列至少包含乙個數 例如,給定序列 2,3,2,4 其中乘積最大的子串行為 2,3 其乘積為6。解答 1.暴力搜尋 o n 2 沒有ac 超時 class solution return max 2.動態規劃思想,max min 每有乙個新的數字加入,...

Leetcode 152 乘積最大子串行

給定乙個整數陣列nums,找出乙個序列中乘積最大的連續子串行 該序列至少包含乙個數 示例 1 輸入 2,3,2,4 輸出 6解釋 子陣列 2,3 有最大乘積 6。示例 2 輸入 2,0,1 輸出 0解釋 結果不能為 2,因為 2,1 不是子陣列。這裡用動態規化的方法,即dp i 為以i結尾乘積最大連...

leetcode152 乘積最大子串行

給定乙個整數陣列 nums 找出乙個序列中乘積最大的連續子串行 該序列至少包含乙個數 示例 1 輸入 2,3,2,4 輸出 6 解釋 子陣列 2,3 有最大乘積 6。示例 2 輸入 2,0,1 輸出 0 解釋 結果不能為 2,因為 2,1 不是子陣列。用三個變數分別記錄最大值,到之前乙個數的最大值和...