Leetcode刷題筆記5

刷leetcode簡單的題目,參考之前用過的手法與學新的手法,如前綴和。

Diameter of Binary Tree

找出樹中最長的距離(邊)。

解法

可以透過DFS下去獲得答案,每次遇到節點 以該節點為中心算出解答,並且回傳長度, 而不是每個節點都要重新算一遍,效能會比較好。

遞迴方法

Climbing Stairs

給一個n階階梯算出總共有幾種走法。

解法

可以發現每階都為前面兩個階梯路徑和,為 f(n) = f(n - 1) + f(n - 2)可以透過動態規劃的方式 實做,不過可以把大小為n的陣列簡化到只須3個變數, 即可很快的求出結果。

Maximum Subarray

給予一個陣列,找出最大子陣列和。

解法

可以透過Kadane's AlgorithmDivide and Conquer的方式, 前者在運行過程當中會不斷的累加,並且保存最大值,直到變成負數而重新計算, 。

後者的算法需要判斷兩種情況

可以透過計算區間加總 (前綴和, prefix sum) 來減少運算量, 而不用每次在遞迴的時候重複運算, 找出前綴和的最大值(由中向右,可以加總到最多的邊界), 和最小值(由中向左,可以加總最大的情況,因為是右邊-左邊), 透過這些計算方法寫出程式碼。

參考


LeetCode Dynamic programming Recursion Divide and Conquer