53 最大子序和

2021-10-03 09:09:39 字數 2674 閱讀 3951

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

示例:

輸入: [-2,1,-3,4,-1,2,1,-5,4],

輸出: 6

解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。

設定兩個變數,乙個變數用來記錄當前最大值,乙個用來記錄全域性最大值

通過迴圈來遍歷陣列。以子陣列的最後乙個位置作為指標。

用兩次for迴圈來遍歷陣列

時間複雜度o(n^2)

#c#

class

solution

}return max;

}}

該演算法通用且簡單:遍歷陣列並在每個步驟中更新

對於初學者比較難理解的就是curr_sum

curr_sum並不是全域性最大值,它比較出來的是截至到這個位置包括這個元素的子序和的最大值,是區域性的。

#python

class

solution

:def

maxsubarray

(self, nums:

'list[int]')-

>

'int'

: n =

len(nums)

curr_sum = max_sum = nums[0]

for i in

range(1

, n)

: curr_sum =

max(nums[i]

, curr_sum + nums[i]

) max_sum =

max(max_sum, curr_sum)

#curr_sum比較當前元素及包括當前元素位置的區域性最大和

#max_sum記錄全域性最大子序和

return max_sum

時間複雜度:o(n)。只遍歷一次陣列。

空間複雜度:o(1),只使用了常數空間。

dp法和貪心演算法差不多,dp直接更改原本陣列減少記憶體,相當於把

curr_sum直接儲存在nums中,即nums[i]等價於curr_sum.

#python

class

solution

:def

maxsubarray

(self, nums:

'list[int]')-

>

'int'

: n =

len(nums)

max_sum = nums[0]

for i in

range(1

, n)

:if nums[i -1]

>0:

nums[i]

+= nums[i -1]

#沿陣列移動並修改陣列,令當前元素為區域性最大值

max_sum =

max(nums[i]

, max_sum)

return max_sum

時間複雜度:o(n)。只遍歷一次陣列。

空間複雜度:o(1),只使用了常數空間。

將乙個陣列對半分為左子陣列和右子陣列,則它的最大子序必然是以下情況中的乙個:

用遞迴的方法,將原陣列分成長度為1的子陣列,使得每個元素都是某個子陣列的最左元素/最右元素,然後回公升的得到原陣列的最大子序和。

class

solution

:def

maxsubarray

(self, nums: list[

int])-

>

int:

n =len(nums)

if n ==1:

return nums[0]

else

: max_left = self.maxsubarray(nums[0:

len(nums)//2

])max_right = self.maxsubarray(nums[

len(nums)//2

:len

(nums)])

#計算穿過中間的最大子序和

max_l = nums[

len(nums)//2

-1]#左陣列的最右元素

tmp =

0for i in

range

(len

(nums)//2

-1,-

1,-1

):tmp += nums[i]

max_l =

max(tmp, max_l)

#左陣列的包含最右元素的最大子序和

max_r = nums[

len(nums)//2

] tmp =

0for i in

range

(len

(nums)//2

,len

(nums)):

tmp += nums[i]

max_r =

max(tmp, max_r)

#返回三個中的最大值

return

max(max_right,max_left,max_l+max_r)

53 最大子序和

給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。兩個變數,乙個是ans,用來儲存 更新子串行 乙個maxn,始終儲存著當前最大的子串行。子串行...

53 最大子序和

題目 給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6。思路 因為要考慮連續,所以需注意兩點,與當前比較的必定包含當前節點的上乙個節點,前n個節點...

53 最大子序和

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