Leetcode 最大子序和(二分法,遞迴思想)

2021-10-03 22:56:32 字數 1958 閱讀 7732

給定乙個整數陣列 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...