《Leetcode》152 乘積最大子陣列

2021-10-06 06:37:46 字數 1668 閱讀 9149

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

例1

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

輸出: 6

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

例2

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

輸出: 0

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

class solution:

def maxproduct(self, nums: list[int]) -> int:

ans = float('-inf')

max,min=1,1

for i in nums:

if i<0:

max,min = min,max

max = max(max*i,i)

min = min(min*i,i)

print('max:{},min:{}'.format(max,min))

ans = max(ans,max)

return ans

max:2,min:2

max:6,min:3

max:-2,min:-12

max:4,min:-48

在補充兩個純正的動態規劃

class solution:

def maxproduct(self, nums: list[int]) -> int:

#動態規劃

if not nums:

return 0

dp_max = [0]*len(nums)

dp_min = [0]*len(nums)

dp_max[0],dp_min[0] = nums[0],nums[0]

#dp_max[i],表示以i結尾的最大連續子陣列

#dp_min[i],表示以i結尾的最小連續子陣列

for i in range(1,len(nums)):

#這樣寫動態轉移方程就已經考慮到正負性了

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

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

#找到dp_max中最大的數字即可

return max(dp_max)

#狀態壓縮

max_f,min_f = nums[0],nums[0]

ans = nums[0]

size = len(nums)

for i in range(1,size):

#使用兩個變數記錄上乙個時刻的值

#dp[i]僅和上乙個狀態量有關係

mx,mi = max_f,min_f

max_f = max(mx*nums[i],max(nums[i],mi*nums[i]))

min_f = min(mi*nums[i],min(nums[i],mx*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 不是子陣列。用三個變數分別記錄最大值,到之前乙個數的最大值和...