LeetCode 最大子序和

2021-09-12 13:41:28 字數 2880 閱讀 1220

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

input:[

-2,1

,-3,

4,-1

,2,1

,-5,

4]output:

6

動態規劃 ( python )
class

solution

:def

maxsubarray

(self, nums)

->

int:

tmp = nums[0]

maxlen = tmp

for i in

range(1

,len

(nums)):

if(tmp <0)

: tmp = nums[i]

else

: tmp += nums[i]

maxlen =

max(maxlen, tmp)

return maxlen

基本思路

動態規劃的思想是最優解包含的每個子問題的解也是最優的。**中的tmp代表的就是子問題的最優解,不過因為這道題中有負數的存在,所以子問題的最優解也可能是負數,所以還需要和0進行比較。另外,這道題沒有代價的概念,只有值的累加,不需要儲存每個子問題的最優解,只需要上一輪的最優解即可。maxlen變數不是主角,其作用只是記錄當前最大值而已。

複雜度分析

for迴圈的時間開銷為o(n

)o(n)

o(n)

,內部為o(1),所以時間複雜度為o(n

)o(n)

o(n)

。空間複雜度為o(1

)o(1)

o(1)

分冶法 ( python )

class

solution

:def

maxsubarray

(self, nums)

->

int:

length =

len(nums)

if(length <=0)

:return

0return self.calsubarray(nums,

0, length -1)

defcalsubarray

(self, nums, left, right):if

(left == right)

:return nums[left]

mid =

(left + right)//2

maxleft = self.calsubarray(nums, left, mid)

maxright = self.calsubarray(nums, mid +

1, right)

#從mid為起點,向左計算最大子串行和, ct意為continuity,連續的

tmp =

0 left_ct = nums[mid]

for i in

range

(mid, left -1,

-1):

tmp += nums[i]

left_ct =

max(tmp, left_ct)

#以mid為起點,向右計算最大子串行和

tmp =

0 right_ct = nums[mid +1]

for i in

range

(mid +

1, right +1)

: tmp += nums[i]

right_ct =

max(tmp, right_ct)

#計算左右子串行交界地帶最大子串行和

maxcross = left_ct + right_ct

return

max(maxleft, maxright, maxcross)

基本思路

分冶法是將原問題逐步劃分成乙個個更小的子問題,再合併的過程。maxleftmaxright是被劃分出的左右兩個序列的最大子序和,但這兩者是不能直接相加的,因為它們在序列裡有可能不是連續的。另外,這兩個序列原先是交接的,它們的交界地帶有可能存在乙個更大的子串行和,所以需要以mid為起點,分別向左右兩邊累加,求得交界地帶最大值。下面舉兩個例子。

input:[

2,-1

,2]說明:這個序列會被劃分成[2]

,[-1

,2]兩個子串行。

最大子串行和分別為 2

,2。但因為兩個2索引不是連續的,所以不能直接相加

input:[

-1,2

,1,2

,-1,

1]說明:這個序列會被劃分成[-1

,2,1

],[2,-

1,1]。

左側最大序列和為 2,右側最大序列和也是2。但是它們的交界地帶有乙個更大的子串行[2,

1,2]

複雜度分析

分冶法的時間複雜度為o(n

2)

o(n^2)

o(n2

), 因為calsubarray被呼叫了n次,這和二分法是不同的,另外遞迴實現也會帶來一定的開銷。空間複雜度為 o(1

)o(1)

o(1)

。參考資料

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

最大和子串行有乙個特徵就是,最大和子串行的起始位置之前的元素相加和肯定是小於等於0的,否則如果大於0,那麼起始點就是前面元素的起始點了,只要大於0就會對子序列起到增加最大值的作用。本演算法正式利用這一特點,只計算所有可能出現最大和的子串行。看下面這個例子 1 2 3 3 4 5 11 7 8 這個序...