該題要求時間複雜度為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。貪心演算法 每一步都求出最優...