演算法
同一個問題,不同的解題思路
可搜尋中文、英文名稱和關鍵字。
主題
每個主題都可以換輸入、單步執行,看演算法實際做了哪些比較、走過哪些格子。成本表是在同一份輸入上把幾種做法都跑一遍量出來的。
先讀這個
排序與搜尋
字串
圖
- 最短路徑核心
BFS(Breadth-First Search,廣度優先搜尋)、Dijkstra、A* 在同一張地圖上找路:BFS 不管路有多難走,Dijkstra 管,A* 還知道終點大概在哪個方向。
也包含:Bellman-Ford 與 Floyd-Warshall
- BFS 與 DFS核心
走遍一張圖的兩種方式:BFS(Breadth-First Search,廣度優先搜尋)用佇列一圈一圈往外擴,DFS(Depth-First Search,深度優先搜尋)用堆疊一路走到底再回頭。換一個資料結構,走法就完全不同。
也包含:強連通分量
- 拓撲排序核心
有先後依賴的工作要排出一個合法順序:每次挑一個沒有前置條件的出來做。圖裡有環就排不出來,而這正好能用來偵測循環依賴。
- 最小生成樹進階
用最少的總成本把所有點連起來。Kruskal 從最便宜的邊開始挑、用並查集避免成環;Prim 從一個點往外長、用堆積挑最近的。
- 最大流與二分匹配進階
一個管線網路最多能送多少水?Ford-Fulkerson 不斷找還有剩餘容量的路徑;同一套方法也能解工作分配這類二分匹配問題。
解題思路
考題:一題多解
- 考題:Two Sum核心
在陣列裡找兩個加起來等於目標的數:暴力兩層迴圈、排序後雙指標、雜湊表一次掃過,成本從 n² 一路降到 n。
- 考題:第 K 大與 Top-K核心
只要前 k 個,就不必把全部排好:整個排序、維持大小為 k 的堆積、Quickselect、桶排序,四種做法放在一起比。
- 考題:島嶼數量核心
數地圖上有幾塊相連的陸地:BFS(廣度優先搜尋)、DFS(深度優先搜尋)、並查集都能解,差在額外記憶體,以及陸地一格一格加進來時能不能接著算。
- 考題:合併 K 個排序串列進階
一個一個合併是 O(kN);用堆積每次挑最小的開頭,或兩兩分治合併,都降到 O(N log k)。
- 考題:最長遞增子序列進階
經典的 O(n²) 動態規劃,對上用二分搜尋維護「每種長度的最小結尾」的 O(n log n) 做法。
- 考題:串列有沒有環進階
用雜湊集合記住走過的節點要 O(n) 記憶體;快慢指標(Floyd)只用兩個指標,就能找到環和環的入口。
- 考題:資料流的中位數進階
數字一個一個進來,隨時要答出中位數:每次重新排序、維持排序好的陣列,或用一大一小兩個堆積,成本差了好幾個數量級。
- 考題:接雨水進階
每一格能積多少水,取決於左右兩邊最高的牆:暴力法 O(n²)、前綴最大值用 O(n) 空間、雙指標只要 O(1) 空間,加上單調堆疊,四種做法放在一起比。
- 考題:會議室 II進階
給一堆會議時段,最少需要幾間會議室?用最小堆積追蹤最早結束的會議,或用掃描線數同時在開的會議數。
- 考題:斷詞進階
一串字能不能切成字典裡的詞?單純回溯會一再重算同樣的後綴而變成指數時間;記憶化、由下而上的動態規劃、BFS(Breadth-First Search,廣度優先搜尋)都把它降到多項式時間。