算法的复杂度分析。 排序算法,以及他们的区别和优化。 数组中的双指针、滑动窗口思想。 利用 Map 和 Set 处理查找表问题。 链表的各种问题。 利用递归和迭代法解决二叉树问题。 栈、队列、DFS、BFS。 回溯法、贪心算法、动态规划。
遞迴求解,通常用於需暴力找出所有排列組合,但又需排除掉某些不正確的組合時使用,通常會有三個主要部分:
當結果符合時,儲存或輸出答案,並跳離遞迴。
一定會有一個 result 用於儲存當前的組合,後面會夾帶 1 ~ N 個參數,用於暫存當前遞迴的狀況,例如 backtracking(current, level), backtracking(current, left, right)
在未滿足符合條件時,要繼續調整參數並且回溯下去,直到找到答案為止。
因為是遞迴求解,所以很抽象不好懂,這裡以 leetcode 的 generate-parentheses 一道題目為例,給定 n,要找出 n 個括號的各種組合,例如 n=2,答案會是 [(()), ()()]
函式寫起來大概會長這樣:
const backtracking = (result, left, right) => {
    if (result.length === n * 2) {
        results.push(result)
        return
    }
    if (left > 0) {
        backtracking(result + '(', left - 1, right)
    }
    if (right > 0 && left !== right) {
        backtracking(result + ')', left, right - 1)
    }
}
一種在有序陣列中尋找某一特定元素的搜尋演算法,原理為將欲搜尋的值,與所有資料的中間值(中位數)做比對。
- 找出 Middle = ⌊(Left + Right)/2⌋
 - 將鍵值key與搜尋範圍的中間資料data[Middle]作比對
 
- key = data[Middle]:找到
 - key < data[Middle]:縮小搜尋範圍 ⇒ Right = Middle-1
 - key > data[Middle]:縮小搜尋範圍 ⇒ Left = Middle+1
 
- 重複上步驟,直到找到資料或搜尋範圍交叉(找不到)
 
- 找出序列中的某筆資料
 - 資料已經依照大小排序過
 
- 宣告兩個變數(快指針、慢指針),指針可以從頭開始、從尾開始或是一頭一尾開始內縮
 - 迴圈每跑一回快指針就加 1,符合特定條件時慢指針加 1
 
- 對序列做一些操作,例如過濾、刪除符合特定條件的數值
 - 不可以使用額外的陣列、只能對給定的陣列進行修改
 - 資料已經依照大小排序過
 
pre-, in-, post-是指parent node相對於child node的順序。假設binary search tree如下:
4
/ 
2   6
/ \ / 
1  3 5  7
preorder: 中->左->右,4213657
inorder: 左->中->右,1234567 (對binary search tree做inorder traversal就是依序拿取)
postorder: 左->右->中,1325764