刷leetcode簡單的題目,參考之前用過的手法與學新的手法,如前綴和。
Diameter of Binary Tree
找出樹中最長的距離(邊)。
解法
可以透過DFS
下去獲得答案,每次遇到節點
以該節點為中心算出解答,並且回傳長度,
而不是每個節點都要重新算一遍,效能會比較好。
遞迴方法
- 如果以這個節點為中心,數值較大就保存
- 回傳左右兩邊最長的路徑
Climbing Stairs
給一個n
階階梯算出總共有幾種走法。
解法
可以發現每階都為前面兩個階梯路徑和,為
f(n) = f(n - 1) + f(n - 2)
可以透過動態規劃的方式
實做,不過可以把大小為n
的陣列簡化到只須3個變數,
即可很快的求出結果。
Maximum Subarray
給予一個陣列,找出最大子陣列和。
解法
可以透過Kadane's Algorithm
或Divide and Conquer
的方式,
前者在運行過程當中會不斷的累加,並且保存最大值,直到變成負數而重新計算,
。
後者的算法需要判斷兩種情況
- 區間穿過中點,左區間由中心往左,右區間由中心往右
- 區間沒有穿過中點,即左右
可以透過計算區間加總 (前綴和, prefix sum) 來減少運算量,
而不用每次在遞迴的時候重複運算,
找出前綴和的最大值(由中向右
,可以加總到最多的邊界),
和最小值(由中向左
,可以加總最大的情況,因為是右邊-左邊
),
透過這些計算方法寫出程式碼。
參考
- 前缀和 & 差分
- LeetCode题解 #53 Maximum Subarray
- How to solve “Maximum Subarray” by using the divide and conquer approach ?
LeetCode Dynamic programming Recursion Divide and Conquer