Leetcode053 最大子序和

2021-08-21 19:34:51 字數 1619 閱讀 1380

給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。

示例:

輸入:[-2,1,-3,4,-1,2,1,-5,4],輸出:6解釋:連續子陣列 [4,-1,2,1] 的和最大,為 6。
高階:

如果你已經實現複雜度為 o(n) 的解法,嘗試使用更為精妙的分治法求解。

一道標準的動態規劃題。設定乙個dp一維列表存放每前進一步時的最優解(本題中就是和),初始的dp[0]為nums的第乙個值。dp列表的取值就是,當前這一步加上之前最優值、當前值中的最大值。不斷迴圈至最後乙個元素。最後找dp中的最大值。**一次通過:

class solution:

def maxsubarray(self, nums):

""":type nums: list[int]

:rtype: int

"""if len(nums) == 0:

return 0

elif len(nums) == 1:

return nums[0]

dp = list(range(len(nums)))

dp[0] = nums[0]

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

dp[i] = max((dp[i-1] + nums[i]), nums[i])

return max(dp)

其實還想到乙個問題,就是問到從**開始的這個最優子列表。想法是設定乙個flag列表,每次使用自身值作為dp元素值時,把座標給flag存進去。最後的最優求和值,對應著乙個下標,這個下標正是最優子列表的結尾下標;而它之前的最後乙個flag的存檔,必然是最優子列表的其實下標。

分治演算法沒有嘗試,看了網上的做法能理解大概意思。轉乙個分治演算法過來:

class solution(object):

def maxsubarray(self, nums):

"""

:type nums: list[int]

:rtype: int

"""

sum = 0

l = len(nums)

if l == 1:

return nums[0]

left = self.maxsubarray(nums[:l//2])

right = self.maxsubarray(nums[l//2:])

s1 = nums[(l//2)-1]

lsum = 0

for i in nums[:l//2][::-1]:

lsum += i

if lsum > s1:

s1 = lsum

s2 = nums[l//2]

rsum=0

for j in nums[l//2:]:

rsum += j

if rsum > s2:

s2 = rsum

sum = s1+s2

if sumthat's all!

LeetCode053 最大子序和

給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。執行用時 56 ms...

LeetCode 053 最大子序和

問題描述 給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6。時間超限 暴力窮舉 1 class solution object 2def maxs...

leetcode最大子序和

給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。在本題中,我想到的兩...