LeetCode 152 乘積最大子串行

2022-06-22 05:00:11 字數 1978 閱讀 9610

給定乙個整數陣列 nums ,找出乙個序列中乘積最大的連續子串行(該序列至少包含乙個數)。

示例 1:

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

輸出: 6

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

示例 2:

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

輸出: 0

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

本題主要考慮使用動態規劃的方法進行求解。

第一步,定義狀態。設 dp[i] 為前 i 個數中的乘積最大子串行,其最大值應從 dp[i-1] 的最大值乘上 nums[i] 中取,這時需要考慮 nums[i] 的正負,若 nums[i] 為正,則 dp[i] 為 dp[i-1] 的最大值乘以 nums[i] ,否則為 dp[i-1] 的最大負值乘以 nums[i] 。所以,跟以往不同,本題的狀態定義需要用到二維陣列,即 dp[i][0] 儲存前 i 個數中乘積正值最大子串行,dp[i][1] 儲存前 i 個數中乘積負值最大子串行。

第二步,獲得狀態轉移方程。

當然,本題的狀態轉移方程也是分為兩種的。

if a[i] > 0:

dp[i][0] = dp[i-1][0] * a[i]

dp[i][1] = dp[i-1][1] * a[i]

else:

dp[i][1] = dp[i-1][0] * a[i]

dp[i][0] = dp[i-1][1] * a[i]

**為:

class solution(object):

def maxproduct(self, nums):

""":type nums: list[int]

:rtype: int

"""if nums is none:

return 0

dp = [[0 for _ in range(2)] for _ in range(2)]

dp[0][1], dp[0][0], res = nums[0], nums[0], nums[0]

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

x, y = i % 2, (i-1) % 2

dp[x][0] = max(dp[y][0] * nums[i], dp[y][1] * nums[i], nums[i])

dp[x][1] = min(dp[y][0] * nums[i], dp[y][1] * nums[i], nums[i])

res = max(res, dp[x][0])

return res

上面**運用了滾動陣列的思想以降低空間複雜度,將原本 2*len(nums) 大小的二維陣列轉成了 2*2 大小的二維陣列。當然該陣列也可直接用變數直接代替,此時**如下:

class solution(object):

def maxproduct(self, nums):

""":type nums: list[int]

:rtype: int

"""if nums is none:

return 0

res, cur_max, cur_min = nums[0], nums[0], nums[0]

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

num = nums[i]

cur_max, cur_min = cur_max * num, cur_min * num

cur_min, cur_max = min(cur_max, cur_min, num), max(cur_max, cur_min, num)

res = cur_max if cur_max > res else res

return res

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