LeetCode 152 乘積最大子串行

2021-09-19 22:55:23 字數 1657 閱讀 8040

這道題目是給定乙個整數陣列,返回乘積最大的連續子串行,題目如下所示:

拿到題目我們肯定會想到的是暴力解法,通過兩層迴圈遍歷陣列中所有的元素,記錄每一次迴圈之後的全域性乘積最小值,直到迴圈結束,我們就可以得到乘積最大的連續子串行,顯然這樣的解法時間複雜度達到了 o(n

2)o(n^2)

o(n2)。

除了暴力的解法,我們可以想一下是否可以用動態規劃dp的方法來解決此問題,那麼如何dp呢?我們來看以下的這個流程:

以題目中的例子為例,我們來看看這個案例的dp過程,首先因為考慮到陣列中可能有負數的緣故,我們可以定義乙個二維陣列,第二維等於0的時候表示最大值,等於1的時候表示最小值,然後res把每一輪動態規劃的最大值記錄下來,直到dp結束。所以**如下所示:

python:

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][0], dp[0][1], 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

除了這種寫法,我們可以把**更加簡化:

class solution(object):

def maxproduct(self, nums):

""":type nums: list[int]

:rtype: int

"""if nums is none:

return 0

res, curmin, curmax = nums[0], nums[0], nums[0]

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

curmin, curmax = curmin * nums[i], curmax * nums[i]

curmin, curmax = min(curmax, curmin, nums[i]), max(curmax, curmin, nums[i])

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