leetcode 152 乘積最大子陣列

2021-10-06 06:29:30 字數 1668 閱讀 3772

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

示例 1:

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

輸出: 6

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

示例 2:

輸入: [-2,0,-1]

輸出: 0

解釋: 結果不能為 2, 因為 [-2,-1] 不是子陣列。

看官方題解後才會做的題。

重點:如果維護乙個儲存連乘乘積最大的陣列,則當前位置的最優解未必是由前乙個位置的最優解轉移得到的

比如[2,-3,2,-3]的最大乘積應該是全部都乘,如果只看前一位,則max陣列為[2,-3,2,-3],最大變成2了。

對於乘法而言,因為乘積會隨著符號改變,所以同時維護2個陣列,1個是當前位置的最大乘積,1個是當前位置的最小乘積,新增的最大乘積,同時考慮前面的最小、最大即可。

class

solution

:def

maxproduct

(self, nums: list[

int])-

>

int:

product_max =[1

] product_min =[1

]for index, each_num in

enumerate

(nums)

: last_max, last_min = product_max[-1

], product_min[-1

]max

(each_num, each_num * last_max, each_num * last_min)

)min

(each_num, each_num * last_max, each_num * last_min)

)print

(product_max)

print

(product_min)

return

max(product_max[1:

])

因為當前狀態只和前乙個狀態有關,所以可以縮減空間,變為:

class

solution

:def

maxproduct

(self, nums: list[

int])-

>

int:

last_max, last_min =1,

1 ret_max = nums[0]

for index, each_num in

enumerate

(nums)

: last_max, last_min =

max(each_num, each_num * last_max, each_num * last_min)

,min

(each_num, each_num * last_max, each_num * last_min)

ret_max =

max(ret_max, last_max)

return ret_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 不是子陣列。用三個變數分別記錄最大值,到之前乙個數的最大值和...