動態規劃 最大連續子串行和

2021-10-10 09:42:54 字數 2365 閱讀 1718

在刷力扣題的時候遇到了乙個連續子陣列最大和問題,下面是題目的鏈結和描述:

輸入乙個整型陣列,陣列中的乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。

要求時間複雜度為o(n)。

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

輸出: 6

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

時間複雜度要求為n,因此不能採用窮舉遍歷的方法,下面介紹兩種方法:分治法(nlogn)、動態規劃(n)

分而治之。假如我們有乙個很複雜的大問題,很難直接解決它,但是我們發現可以把問題劃分成子問題,如果子問題規模還是太大,並且它還可以繼續劃分,那就繼續劃分下去。直到這些子問題的規模已經很容易解決了,那麼就把所有的子問題都解決,最後把所有的子問題合併,我們就得到複雜大問題的答案了。

接下來分析這個問題:

首先,我們可以把整個序列平均分成左右兩部分,答案則會在以下三種情況中:

所求序列完全包含在左半部分的序列中。

所求序列完全包含在右半部分的序列中。

所求序列剛好橫跨分割點,即左右序列各佔一部分。

前兩種情況和大問題一樣,只是規模小了些,如果三個子問題都能解決,那麼答案就是三個結果的最大值。第一和第二個小問題比較簡單,可以利用遞迴表示,主要是第三個問題的分析:

只要計算出:以分割點為起點向左的最大連續序列和、以分割點為起點向右的最大連續序列和,這兩個結果的和就是第三種情況的答案。因為已知起點,所以這兩個結果都能在o(n)的時間複雜度能算出來。

def

maxsum

(nums):if

len(nums)==1

:return nums[0]

#分組 center =

len(nums)//2

left_nums = nums[

0:center]

right_nums = nums[center:

len(nums)

]#分別求左右序列最大子串行和

left_maxsum = maxsum(left_nums)

right_maxsum = maxsum(right_nums)

#求左序列最大和(包括最後乙個元素)

left_sum =

0 left_max= left_nums[

len(left_nums)-1

] i =

len(left_nums)-1

while i >=0:

left_sum += left_nums[i]

if left_sum > left_max:

left_max = left_sum

i -=

1#求右序列最大和(包括第乙個元素)

right_sum =

0 right_max = right_nums[0]

i =0while i <

len(right_nums)

: right_sum += right_nums[i]

if right_sum > right_max:

right_max = right_sum

i +=

1 l =

[left_maxsum,right_maxsum,left_max + right_max]

return

max(l)

對於原列表nums,假設元素nums[i]為所求子列表的最後乙個元素,則所求子列表有兩種情況:

1)不含nums[i]之前的元素

2)含有nums[i]之前的序列(該序列為之前累加得到)

所以求解過程為:對列表中每乙個元素作出上述假設並分別求解兩種情況,並比較記錄最大值。

具體實現如下,時間複雜度o(n),空間複雜度o(1):

def

maxsubarray

(self, nums)

: n =

len(nums)

sum_value = max_value = nums[0]

for i in

range(1

, n)

:# 如果前面序列和的結果小於零 則丟棄(即從兩種情況中取最大值)

sum_value =

max(

0, sum_value)

# 如果和是正直,則保留,否則捨棄

sum_value += nums[i]

# sum往後加

max_value =

max(sum_value, max_value)

# max為當前最大值或者繼續加的最大值

return max_value

動態規劃的方法就可以直接解決問題。

動態規劃 最大連續子串行和

題目大意就是讓你選出一段和最大的連續序列,當有幾個序列和並列時,選出下標最小的的連續序列。可以採用動態規劃的思想解決,設一連續序列為a 0 a 1 a n 分別以a 0 a 1 a n 結尾的最大序列和為d 0 d 1 d n 若d i 1 0,則d i d i 1 a i 若d i 1 0,則d ...

動態規劃 最大連續子串行和

動態規劃 最大連續子串行和 問題描述 給定乙個數字序列a1,a2,an,求i,j 1 i j n 使得ai aj最大,輸出這個最大和。樣例 211 413 5 2顯然 11 4 13 20 為和最大的選取情況,因此最大和為20 下面介紹動態規劃的做法,複雜度為o n 讀者會發現其實左端點的列舉是沒有...

動態規劃 最大連續子串行和

給定乙個數字序列,a1,a2,an,求i,j 1 i j n 使得ai aj最大,輸出這個最大和。樣例輸入 2 11 4 13 5 2 輸出 20 即11 4 13 20 最大 分析 如果暴力做的話,乙個列舉,需要o n 2 在計算需要o n 一共需要o n 3 因為重複計算的太多了,還是設定乙個d...