求連續子陣列的最大和

2021-08-26 17:44:39 字數 1844 閱讀 2923

一般考陣列的題目,重在挖掘數字時間的規律,只要找到規律就可以寫遞推關係式,很容易編寫基於迴圈的

或者是動態規劃的程式。

第一種解法:基於sum更新的解法

class solution

return summax;}};

第二種解法:自低向上的遞迴

使用動態規劃

f(i):以array[i]為末尾元素的子陣列的和的最大值,子陣列的元素的相對位置不變

f(i)=max(f(i-1)+array[i] , array[i])

res:所有子陣列的和的最大值

res=max(res,f(i))

如陣列[6, -3, -2, 7, -15, 1, 2, 2]

初始狀態:

f(0)=6

res=6

i=1:

f(1)=max(f(0)-3,-3)=max(6-3,3)=3

res=max(f(1),res)=max(3,6)=6

i=2:

f(2)=max(f(1)-2,-2)=max(3-2,-2)=1

res=max(f(2),res)=max(1,6)=6

i=3:

f(3)=max(f(2)+7,7)=max(1+7,7)=8

res=max(f(2),res)=max(8,6)=8

i=4:

f(4)=max(f(3)-15,-15)=max(8-15,-15)=-7

res=max(f(4),res)=max(-7,8)=8

以此類推  ,,,,,,,,,,,,

class solution

return res;}};

上邊的也可以開闢 vectordp(size,0)

然後 每次計算結果都儲存在 dp[i]中,最後返回dp陣列中的最大值就好!

第三種解法:分治策略

分治策略,旨在將原先的大問題不斷分解成規模小的問題,比如求最大連續子陣列之和,先將原陣列以中間界線分為三部分,左邊是中界線左邊的元素,右邊是中界線右邊的元素,第三部分是兩邊都有分布的元素的集合,因為最大連續子陣列之和一定是這三部分之其中的乙個,所以最後比較這三部分中最大的,就是最大連續子陣列之和,也是該函式的返回值。而左邊、右邊的計算都繼續遞迴分治函式,直到只有乙個元素為止,而第三部分是以中間界線分別向左、向右連續相加,找出最大連續子陣列之和,這是最關鍵的一步。

迭代次數為n=(mid-low+1)+(high-mid),也是將原本o(n^2)演算法通過分治降為o(nlogn)的主要原因。

分制演算法的**也比較好理解,只是找三個最大值,同樣是基於遞迴進行分,然後合併的時候找中間的最大值!

求連續子陣列最大和

輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。例如輸入的陣列為 2,11,4,13,5,2 和最大的子陣列為11,4,13 因此輸出為該子陣列的和20。本題解法多種多樣,時間複雜度可以為 o n 3 o n 2 o ...

求連續子陣列的最大和

題目一 給定乙個陣列,求該陣列的最大子陣列和 與求最長連續子陣列互為姊妹題 題目二 給定乙個陣列,求該陣列的最大兩個子陣列的和 子陣列位置無重合 解題一 子陣列的最大和 技巧法 func getmaxsum arr int int res intmin cur 0 for ele range arr...

求連續子陣列的最大和

題目 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第3個為止 思路 從頭到尾逐個累加,儲存兩個值 當前和 最大和。public c...