在刷力扣題的時候遇到了乙個連續子陣列最大和問題,下面是題目的鏈結和描述:
輸入乙個整型陣列,陣列中的乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。
要求時間複雜度為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...