給定乙個整數陣列 nums ,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。示例:輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。
高階: 如果你已經實現複雜度為 o(n) 的解法,嘗試使用更為精妙的分治法求解。
拆分序列的左側序列
拆分序列的右側序列
拆分序列的中間,原陣列的最大子序和的序列被一分為二
顯然,對於子問題1,2都可以用簡單的遞迴解決。但是對於子問題3需要單獨的乙個程式解決。
我們明確思路,主函式輸入是陣列s
,返回三種情況的最大值max(left, right, cross)
。遞迴結束的標誌為字串只有乙個數字,返回該數字即可
**如下:
class
solution
(object):
defmaxsubarray
(self, nums)
:"""
:type nums: list[int]
:rtype: int
"""iflen
(nums)==0
:return
0else
:return self.findmax(nums,0,
len(nums)-1
)def
findmaxcrossing
(self, nums, left, right)
:# 輸入的left和right是邊界的索引
mid =
(left+right)//2
left_sum =
float
('-inf'
) sum_cross =
0# mid項被算入左側子串進行處理
for i in
range
(mid, left-1,
-1):
# for迴圈的逆序,有上界無下界(有始無終)
sum_cross = sum_cross + nums[i]
if sum_cross >= left_sum:
left_sum = sum_cross
right_sum =
float
('-inf'
) sum_cross =
0for i in
range
(mid+
1, right+1)
:# 注意處理好分界點
sum_cross = sum_cross + nums[i]
if sum_cross >= right_sum:
right_sum = sum_cross
return right_sum+left_sum
deffindmax
(self, nums, left, right)
:# 遞迴
# 明確結束遞迴的條件
if left == right:
return nums[left]
mid =
(right+left)//2
# int是向下取整
left_max = self.findmax(nums, left, mid)
right_max = self.findmax(nums, mid+
1, right)
cross_max = self.findmaxcrossing(nums, left, right)
return
max(right_max, left_max, cross_max)
需要注意的點:
遞迴結束的條件
每次迭代的時傳入函式的陣列的分界點
leetcode最大子序和
給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。在本題中,我想到的兩...
Leetcode 最大子序和
題目描述 給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。解題思路 ...
LeetCode 最大子序和
給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。input 2,1 3,4,1 2,1 5,4 output 6動態規劃 python class solution def maxsubarray self,nums int tmp nums 0 ma...