leetcode 連續子陣列的最大和

2021-10-04 19:57:42 字數 1901 閱讀 4166

該題要求時間複雜度為o(n),對於連續子陣列最大和問題,使用分治演算法時間複雜度為o(nlgn),而使用動態規劃演算法時間複雜度為o(n).因此本題考慮使用動態規劃演算法求解.

接下來分析該問題的最優子結構,假設當前陣列a[0:n]的連續子陣列最大和為s

ns_n

sn​, 它與陣列a[0:n-1]的連續子陣列最大和sn−

1s_

sn−1

​是否存在某種聯絡.進一步分析我們發現,由於陣列a[0:n]的連續最大和子樹組可能出現在陣列a[0:n]的中間位置,因此其與a[0:n-1]的連續最大和子樹組之間不存在直接的推導關係.由此可見我們從該角度出發無法推導出最優子結構.

上述思路無法進行下去的直接原因在於a[0:n]與a[0:n-1]兩個陣列之間相差了乙個a[n-1],而由於a[n-1]與a[0:n-1]的連續最大和子陣列之間並不存在直接關聯,因此無法推導出最優子結構.

在使用動態規劃求解最優解問題中,通常涉及作出乙個初始選擇, 在連續子陣列最大和問題中,我們需要確定連續子陣列的左右邊界.我們可以作出如下初始選擇:選擇i為連續最大和子陣列的右邊界,假設當前選擇為最優選擇,我們使用s

ns_n

sn​表示以陣列元素a[n]結尾的連續子樹組最大和.此時我們分析sn−

1s_

sn−1​與s

ns_n

sn​的關係,我們可以推導出:

i f:

if:if:sn

−1

>=0

s_>=0

sn−1

​>=0

, s n=

sn−1

+a[n

]s_n = s_ + a[n]

sn​=sn

−1​+

a[n];el

se

:else:

else:sn=

a[n]

s_ = a[n]

sn​=a[

n]我們需要計算所有s[1

],s[

2],.

..s[

n]

s[1],s[2], ...s[n]

s[1],s

[2],

...s

[n], 選擇最大值作為連續子樹組的最大和.

注意到在計算s

ns_n

sn​時,我們需要計算sn−

1s_

sn−1

​ ,進一步我們為了計算sn−

1s_

sn−1

​又涉及計算sn−

2s_

sn−2

​.而在計算sn−

1s_

sn−1

​時,我們又要再次計算sn−

2s_

sn−2

​,因此子問題存在重疊.故而應當使用動態規劃演算法.

我們可以使用自底向上的動態規劃演算法,依次計算s[1

],s[

2],.

..s[

n]

s[1], s[2], ...s[n]

s[1],s

[2],

...s

[n].

class

solution

return res;

}}

從上述**結構不難發現,該演算法的時間複雜度為o(n).我們可是使用動態規劃演算法的理論進行驗證.對於任意動態規劃演算法,其時間複雜度為一下兩項乘積:

演算法涉及的子問題個數

在每一步解決子問題時,需要作出的選擇.

在上述演算法中,子問題個數為n, 我們需要計算s[1], s[2], …s[n].而在解決每一步解決子問題時,我們的選擇為1, 例如在計算s[3]時,我們的連續最大和子陣列右邊界是確定的,我們可以在o(1)的時間判斷其左邊界與s[2]保持一致還是變為3.因此該演算法的時間複雜度為o(n).

leetcode 連續的子陣列和

給定乙個包含 非負數 的陣列和乙個目標 整數 k,編寫乙個函式來判斷該陣列是否含有連續的子陣列,其大小至少為 2,且總和為 k 的倍數,即總和為 n k,其中 n 也是乙個整數。示例 1 輸入 23,2,4,6,7 k 6 輸出 true 解釋 2,4 是乙個大小為 2 的子陣列,並且和為 6。示例...

leetcode面試題42 連續子陣列的最大和

題目描述 示例動態規劃 分析 結果輸入乙個整型陣列,陣列裡有正數也有負數。陣列中的乙個或連續多個整數組 成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度為o n 輸入 nums 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。這道題網上的解法有...

Leetcode 連續子陣列的最大和

leetcode 輸入乙個整型陣列,陣列裡有正數也有負數。陣列中的乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度為o n 示例1 輸入 nums 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。貪心演算法 每一步都求出最優...