給定乙個整數陣列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 的解法,嘗試使用更為精妙的分治法求解。在本題中,我想到的兩...