遞迴 (Recursion),通過調用自身函數,有時可以將某個複雜的問題,分解為規模較小的子問題。而 Recursion 也經常和以下演算法配合使用 :
- 分治法 divide and conquer
- 回溯法 backtrack
- 動態規劃 dynamic programming
在實際狀況中,遞迴函數的設計常常很難想像,因為遞迴設計屬於逆向思維,在設計遞迴函數的時候,非常容易被這種層層嵌套搞暈,在這裡簡單給個模板範例講解。


遞迴 (Recursion),通過調用自身函數,有時可以將某個複雜的問題,分解為規模較小的子問題。而 Recursion 也經常和以下演算法配合使用 :
- 分治法 divide and conquer
- 回溯法 backtrack
- 動態規劃 dynamic programming
在實際狀況中,遞迴函數的設計常常很難想像,因為遞迴設計屬於逆向思維,在設計遞迴函數的時候,非常容易被這種層層嵌套搞暈,在這裡簡單給個模板範例講解。

在刷 leetcode 時,都會需要分析和解釋一下自己寫的程式的演算法複雜度,基本上主要是解釋 :
- 時間複雜度
- 空間複雜度
從以上兩個面相去分析 code 效率、品質、trade off,本文記錄一些分析要點。另外建議面試的時候,當對題目有想法時,先不用急著直接實作,而是先估出複雜度,並和面試人討論,確認不會 TLE ;空間是否需要優化;符不符合題目要求等等,最後再開始寫。

Multiple points 的操作,經常用在 array 或 linkedList 上,有幾點事情可以在刷題時特別注意:
- 指標會把 list 切成幾個部分,特別注意每一部份的定義
- list 是否有排序或可以排序
- 指標移動是使用快慢指標還是左右指標
- 會不會改變原本的 list
其中第一點,把 array 切成幾個部分,每個部份的定義,是最重要的思想,可以多思考。

Dynamic Programming 大概算是 leetcode 裡面平均難度最高的章節了,還蠻需要練習的。但在講 DP 之前,我們可以先講 Search,因為 Dynamic Programming 其實就是 Search + Memoization。

前面有介紹了 Binary Search 的通用模板,但通用模板還是有缺點,就是要找的目標須在 array 範圍內,這樣才能定義 index。但很多時候題目並不會有一個準確的 array 被定義,還是需要了解各個模板才能比較好的去解答各式題目。

Binary-Search (二分搜尋法),是一種針對已經排好序的區間內, O(logN) 的搜索方式。 Binary-Search 在處理邊界時很容易出錯。 基本上都是沒注意到兩大原則 :
- 每次都一定要縮減收所區域
- 每次縮減不能排除潛在答案
雖然淺顯易見,但實踐在寫的時候還是常常會寫出 bug 。

