leetcode 152 乘積最大子陣列

2021-10-06 06:43:58 字數 2421 閱讀 5835

題目描述

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

示例 1:

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

輸出: 6

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

示例 2:

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

輸出: 0

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

分析:動態規劃

dp_max[i]:以第 i 個元素的結尾的連續子串行的最大乘積, 如果當前的第 i 個元素為正,可以直接乘,如果為負,就不乘,按照這個想法,最終的結果就是錯誤的,如 [-2,2,3,-3] 對應 dp = [-2, 2, 6 , -3] 正確結果為 [-2,2,6, -2 * 2 * 3 * -3]。

所以,我們應該考慮當前元素正負的情況,如果當前元素為正,nums[i] 應該 乘上 以 nums[i-1]結尾的盡可能大的正數,如果當前元素為負,nums[i] 應該乘上 以nums[i-1] 結尾的盡可能小的負數,這樣才能更大的數。

於是,我們再維護乙個 dp_min[i] ,以 nums[i] 結尾的連續子串行的最小乘積。

dp_max[i] = max(dp_max[i-1] * nums[i] ,dp_min[i-1] * nums[i-1] , nums[i])

dp_min[i] = min(dp_max[i-1] * nums[i],dp_min[i-1] * nums[i-1],nums[i])

base case :

dp_max[0] = nums[0]

dp_min[0] = nums[0]

最終結果:max(dp_max)

同理,我們求連續子串行的最小乘積也要維護 dp_max,dp_min 陣列,最後只要求 min(dp_min)即可。

def

maxproduct

( nums)

:"""

:type nums: list[int]

:rtype: int

"""n =

len(nums)

if n ==1:

return nums[0]

dp_max =[0

]* n

dp_min =

[float

('inf')]

* n

dp_max[0]

=max([

0,nums[0]

])dp_min[0]

= nums[0]

for i in

range(1

,n):

dp_max[i]

=max

([dp_max[i-1]

* nums[i]

,dp_min[i-1]

* nums[i]

,nums[i]])

dp_min[i]

=min

([dp_max[i-1]

* nums[i]

,dp_min[i-1]

* nums[i]

,nums[i]])

print

(dp_min)

return

max(dp_max)

優化空間:

由於第 i 個狀態只和第 i - 1 個狀態相關,根據「滾動陣列」思想,我們可以只用兩個變數來維護 i - 1 時刻的狀態,乙個維護 dp_max , 乙個維護dp_min.

空間複雜度: o(1)

def

maxproduct

( nums)

:"""

:type nums: list[int]

:rtype: int

"""n =

len(nums)

if n ==1:

return nums[0]

max_f = nums[0]

min_f = nums[0]

ans = nums[0]

for i in

range(1

,n):

imax = max_f

imin = min_f

max_f =

max(

[imax* nums[i]

,imin * nums[i]

,nums[i]])

print

(max_f)

min_f =

min(

[imax * nums[i]

,imin * nums[i]

,nums[i]])

ans =

max(max_f,ans)

return ans

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