輸入乙個整型陣列,陣列中的乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。
要求時間複雜度為o(n)。
示例1:
輸入: nums = [-2,1,-3,4,-1,2,1,-5,4]
輸出: 6
解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。
問題拆解
求連續子陣列的和的最大值。
假設陣列長度為n。
那麼如果知道前n-1子陣列的和的最大值maxn-1,那麼到第n個陣列的最大值就容易求得了。
狀態定義
一維陣列。
設以nums[i]為結尾的最大子陣列和為dp[i]。
其實看到有很多博文總結的說是以這個條件,但是我個人思考了一段時間,不知道為什麼需要這樣。因為一般來說,我們更常見的是用dp
if(nums.length ==1)
int[
] dp =
newint
[nums.length]
; dp[0]
= nums[0]
;for
(int i =
0; i < nums.length; i++
)int max = dp[0]
;for
(int i =
1; i < nums.length; i++)}
return max;
}}考慮優化
不必儲存所有的子陣列的最大和,只把子陣列和的最大值存起來,每次比對當前累加的值和最大值的大小並且更新最大值就可以了。
class
solution
else
}return max;
}}
動態規劃 由簡單到難
爬樓梯問題 每次可以爬1或2個台階 爬到第10層有幾種辦法 climb lambda x climb x 1 climb x 2 if x 2 else x 另一種實現 def climb n temp 1,2 for i in range 3,n 1 temp i 2 sum temp retur...
動態規劃簡介及步驟
一 演算法介紹簡單來說,就是將乙個問題的多階段過程拆分為一系列單階段,逐步遞推,利用各階段間的關係,求出問題的最優解或解法之和。二 演算法思路 1.遞迴到動歸的一般轉化方法 遞迴函式有n個引數,就定義乙個n維的陣列,陣列下標是遞迴函式引數的取值範圍,陣列元素的指就是遞迴函式的返回值,這樣就可以從邊界...
動態規劃 一
在現實生活中,有一類活動的過程,由於它的特殊性,可將過程分程若干個互相聯絡的階段,在它的每一階段都需要作出決策,從而使整個過程達到最好的活動效果。當然,各個階段決策的選取不是任意確定的,它依賴於當前面臨的狀態,又印象以後的發展,當各個階段決策確定後,就組成乙個決策序列,因而也就確定了整個過程的一條活...