LeetCode 模式指南
優先度 5/5 — 必備 — 幾乎每一輪面試都會出現面試方法論
入口:從題目敘述走到解它的那張 card — 敘述裡的訊號、限制條件的提示、模式、指向那張 card 的連結,以及長得像、其實不是的那一題。這裡只做路由:每個模板都在表格連到的 card 裡。
練習 14/27 ok · 11 again · 下一題: LC 206, LC 322, LC 347
共 137 份速查表,依「在 FAANG 軟體工程面試中實際出現的頻率」排序。照著 複習路徑 依序讀完最重要的那些,或依優先度、主題瀏覽。
59 份核心速查表,依學習順序排列 —— 先是 12 份基礎,接著是其餘必備,再來是高價值。重讀完一份的標星模板後就標記為已複習;一週後(高價值為兩週)會再次到期。
進度只存在這個瀏覽器裡。
閱讀階梯:每一份都是下一份的前提。
入口:題目裡的訊號 → 模式 → 解它的那張 card。
練習 14/27 ok · 11 again · 下一題: LC 206, LC 322, LC 347
原地改寫,以及「用索引當雜湊」的技巧。
練習 4/15 ok · 3 again · 下一題: LC 88, LC 2657, LC 41
面試中使用率最高的單一資料結構。
練習 5/16 ok · 4 again · 下一題: LC 347, LC 146, LC 438
依條件擴張與收縮 — 自成一個題型家族。
練習 5/14 ok · 4 again · 下一題: LC 438, LC 4067, LC 992
DFS 的狀態如何往下傳、又如何往上收。
練習 13/20 ok · 5 again · 下一題: LC 572, LC 222, LC 652
層序走訪,以及它為什麼能給出最短路徑。
練習 4/13 ok · 3 again · 下一題: LC 542, LC 785, LC 752
每一道圖/樹題目都會重複用到的遞迴模式。
練習 9/20 ok · 7 again · 下一題: LC 417, LC 124, LC 101
Top-k 與「反覆取出最好的那個」這類問題。
練習 5/18 ok · 6 again · 下一題: LC 347, LC 23, LC 703
最大也最難的五星區塊 — 時間要留最多給它。
練習 11/30 ok · 14 again · 下一題: LC 91, LC 139, LC 300
幾乎每一輪面試都會出現的其餘內容。
日常字串目錄 — 字元層級的雙指標掃描、頻率與 anagram 簽章、run-length 分組、切詞、解析與原地改寫 — 至於題解倉庫、語言層級的字串 API、回文、子字串搜尋與雙序列 DP,則各自有自己的一張表。
練習 3/13 ok · 3 again · 下一題: LC 696, LC 388, LC 71
LIFO 的基本功,加上堆疊的經典模板:括號配對、min-stack、單調堆疊的精簡版、用顯式堆疊做走訪,以及作用域/上下文帳本。
練習 2/12 ok · 5 again · 下一題: LC 155, LC 232, LC 636
單向與雙向鏈結串列的指標手術:反轉、合併、重排、虛擬頭節點技巧,以及環的處理。
練習 4/23 ok · 10 again · 下一題: LC 206, LC 19, LC 143
只談有序的樹 —— left < root < right 這條不變式換來了什麼(O(log n) 搜尋、中序即排序、依範圍剪枝、順序統計)。
練習 4/12 ok · 5 again · 下一題: LC 230, LC 450, LC 669
樹的概念、樹的種類,以及走訪順序的策略 — 講的是為什麼與選哪個,再加上在這裡講解的進階技巧(Morris 穿線、倍增法,以及換根 DP,LC 834 的家)。各模式的二元樹模板放在 tree2.md。
練習 4/10 ok · 2 again · 下一題: LC 297, LC 99, LC 114
最近共同祖先、節點間距離、父節點表(雙向)走訪,以及根到葉的路徑模板——所有答案是一條路徑或一個交會點、而不是某種形狀的樹問題。
練習 8/14 ok · 5 again · 下一題: LC 124, LC 437, LC 1644
圖的表示法、走訪、連通性、環偵測,以及一般圖題的完整目錄。
練習 9/18 ok · 3 again · 下一題: LC 269, LC 785, LC 721
針對一個候選答案的範圍,搭配單調的可行性判定式做二分搜尋 — canFinish / isValid 的寫法、「最小化最大值 vs 最大化最小值」的取捨、[max(nums), sum(nums)] 邊界配方,以及在值域上做計數的判定式。
練習 3/14 ok · 5 again · 下一題: LC 1552, LC 378, LC 2616
用中文把 0/1 背包從「物品重量價值」一路講到 LC 494/416 的解題流程,重點放在狀態怎麼定義、「拿或不拿」的轉移、以及為什麼內層迴圈一定要倒序;完全背包(Unbounded)與排列/組合的迴圈順序規則不在這裡展開。
尚無練習路徑
帶「復原」動作的系統性搜尋:choose/explore/un-choose 骨架、start_idx 的控制、跳過重複、剪枝,以及每個必會題型剛好一份的標準模板 — 大量的實作解答與 hard 級的帶狀態模板放在兩個衛星檔裡。
練習 4/23 ok · 5 again · 下一題: LC 39, LC 17, LC 131
完整的背包問題家族:0/1 vs 完全背包(unbounded)vs 有界背包(bounded)vs 分組背包(group)、子集合和(subset-sum)的化簡、為什麼 0/1 的內層迴圈要倒序,以及區分組合與排列的迴圈順序規則。
練習 2/13 ok · 6 again · 下一題: LC 322, LC 416, LC 279
每一個 Python 內建與容器操作實際上要花多少成本,以及為什麼:內建函式、list、str、dict/set、tuple、deque、heapq、bisect 與 int 的逐項查表,每個成本背後的 CPython 記憶體排版,以及那七個會悄悄把 O(n) 解法變成 O(n²) 的寫法。
尚無練習路徑
常見到這裡有缺口就會掉關。
把二維格子當成一個獨立主題來看 —— 走訪的幾何(螺旋、對角、旋轉、轉置)、原地標記,以及索引↔座標的換算。
尚無練習路徑
用堆疊解運算式的題型家族:計算機三兄弟(LC 224 / 227 / 772)、decode-string 式的巢狀(LC 394),以及後綴/依序運算元求值(LC 150、682),還有讓運算子優先序自然浮現的 pre_op 延遲插入技巧。
尚無練習路徑
next greater/previous smaller/span/直方圖這類題目 — 堆疊本身保持有序,所以每個元素只被推入與彈出一次。
尚無練習路徑
走在鏈結串列節點上的雙指標:快慢指標找環、找中點、找倒數第 k 個、以及固定間距指標。不談陣列索引。
尚無練習路徑
前綴樹 — insert/search/startsWith、節點該怎麼擺,以及那些「共用前綴」就是全部訣竅的題目(自動補完、單字搜尋、XOR trie)。
尚無練習路徑
把樹變成字串、再變回來 — 用子樹指紋做身分辨識與重複偵測,以及完整的編碼/解碼家族(括號式、逗號加 null 標記、深度前綴)。
尚無練習路徑
從扁平的東西把二元樹建起來:兩組走訪陣列、單一陣列上的索引區間,或是帶括號/中序的字串 — 也就是所有「只讀取樹」的題目的反方向。
尚無練習路徑
從每個樹的模式連到教它的那一張卡片的索引,再加上核心表單沒寫出來的幾種走訪:迭代的前序與後序、之字形層序、左下角的值,以及垂直順序。
練習 0/8 ok · 下一題: LC 144, LC 145, LC 103
併查集(disjoint set union)——無向圖的連通性、連通元件計數、環偵測,搭配路徑壓縮與按秩合併。
尚無練習路徑
O(N log N) 最長遞增子序列背後的紙牌遊戲演算法:牌堆、牌堆收斂成的 tails 陣列、如何還原子序列本身,以及可以歸約到它的題目家族。
尚無練習路徑
以分割(partition)為基礎的選擇演算法:只保留 quicksort 分割後的其中一側,在平均 O(n) 時間內找出第 k 大、第 k 小或最接近的 k 個元素;也收它可用的各種分割方式,以及讓最壞情況變成線性的 median-of-medians pivot。LC 215 的 quickselect 解法以這裡為主場;堆積解法在 heap.md。
練習 3/9 ok · 1 again · 下一題: LC 347, LC 1985, LC 1337
排序(sorting)演算法與周邊技巧 — 比較式排序與其穩定性、計數/桶/基數排序、quickselect、自訂比較器,以及循環排序(cyclic sort)。
尚無練習路徑
模板索引:每個經典 DP 模式各佔一小節(Kadane、LIS、MCM、LCS、背包、狀態機、格子、位元遮罩、數位、樹上 DP、正規表達式、加權區間排程、切分、記憶化 DAG)。
尚無練習路徑
為什麼自底向上 DP 的迴圈巢狀與方向是由它自己的轉移式所決定的、錯誤順序會失敗的四種方式,以及用五種順序實作 LC 139 Word Break——包括那個看起來正確、能通過 "leetcode"、卻悄悄在題目自己的 Example 2 上失敗的寫法。
尚無練習路徑
在一或兩個字串上做的 DP:dp[m+1][n+1] 的雙序列網格、以前綴為基礎(1-indexed)的表格設計,以及 LCS、編輯距離、交錯字串、萬用字元/括號比對的完整範例。
尚無練習路徑
一套機械化的流程:遞迴 → 記憶化(memoization) → 表格化(tabulation) → 空間最佳化,一次套用在一題上。
尚無練習路徑
把遞迴當成一種機制來談:base case、往下傳的狀態 vs 往上回傳的結果、呼叫堆疊的成本,以及怎麼改寫成迭代。使用遞迴的那些題型家族各自有專屬檔案。
尚無練習路徑
每一步選當下最好的,以及證明這樣做安全的交換論證——區間排程、跳躍遊戲、任務分配——外加怎麼看出貪婪會失敗、必須改用 DP 的時機。
尚無練習路徑
低階設計那一關 — 類別建模、SOLID,以及面試官真的會問的設計模式(strategy、observer、factory、state),附完整的設計範例。
尚無練習路徑
LC 的「設計一個 X」題型:從題目讀出必須支援的操作,再挑出能讓每個操作都做到 O(1) 或 O(log n) 的結構組合;實際寫出來的設計放在 examples 那一頁。
尚無練習路徑
Java 的 String 與 StringBuilder 操作 — 與 char[] 互轉、切片、解析、組字串與修改 — 加上所有跟 comparator 有關的東西:陣列、集合與 map 的排序,以及決定順序的回傳值規則。
尚無練習路徑
存放資料用的 Java 函式庫 API:陣列與二維陣列、list、map、佇列、堆積、堆疊與 pair — 每一種怎麼初始化、複製、走訪、索引,以及過程中的陷阱。
尚無練習路徑
決定「正確的演算法會不會算出正確答案」的那些 Java 語言語意:字元其實是整數、傳值與傳參考的差別,以及整數運算。函式庫 API 則放在另外兩份姊妹速查表。
尚無練習路徑
解題過程中會用到的 Python 語言慣用寫法 — 複製、字串處理、排序 key、整數運算、生成式(comprehension)與作用域 — 依「你想做什麼」來分組。標準函式庫、索引運算與各項操作的成本另有專屬速查表。
尚無練習路徑
Python 解法「邏輯明明對了卻答錯」的兩大元凶:插入到底落在哪一格,以及一段索引區間指的是「個數」還是「距離」。
尚無練習路徑
逐個函式庫的參考手冊:heapq、sortedcontainers、內建排序(sorted / list.sort)、bisect、collections、itertools、functools 與 datetime——每個呼叫、它們的複雜度,以及各自是為了取代哪一種手寫寫法而存在。
尚無練習路徑
幾乎每一輪 FAANG 面試都會遇到 — 應該要能默寫出來。
面試方法論
入口:從題目敘述走到解它的那張 card — 敘述裡的訊號、限制條件的提示、模式、指向那張 card 的連結,以及長得像、其實不是的那一題。這裡只做路由:每個模板都在表格連到的 card 裡。
練習 14/27 ok · 11 again · 下一題: LC 206, LC 322, LC 347
面試方法論
查表用:每個常見資料結構與經典演算法的 Big-O,以及背後的數學直覺。
陣列與字串
陣列的基本功——原地改寫、旋轉、分割,以及「用索引當雜湊」的招式。它擁有這些操作本身;至於各個模式家族(視窗、指標、前綴和)各有自己的檔案。
練習 4/15 ok · 3 again · 下一題: LC 88, LC 2657, LC 41
雜湊、堆疊與佇列
鍵→值的題型模式:查找、分組、索引表、前綴和表、重新映射。
練習 5/16 ok · 4 again · 下一題: LC 347, LC 146, LC 438
陣列與字串
陣列與字串上的雙指標家族:兩端向內收斂、快慢指標、從中心擴張、讀寫分離的原地重寫,每一種各給一個標準模板;依條件伸縮的視窗題不在這裡。
練習 8/16 ok · 4 again · 下一題: LC 5, LC 647, LC 88
陣列與字串
依條件伸縮的視窗 — 固定大小、可變大小、至多 k 個,以及用相減湊出的恰好 k 個;擴張/收縮迴圈與七個標準視窗模板都歸這裡管。
練習 5/14 ok · 4 again · 下一題: LC 438, LC 4067, LC 992
搜尋與排序
對單調搜尋空間做折半 — l <= r 與 l < r 背後的迴圈不變式推理、邊界(lower / upper bound)模板、旋轉陣列,以及浮點數與二維搜尋。
練習 8/20 ok · 4 again · 下一題: LC 300, LC 35, LC 702
樹與堆積
二元樹特有的思路:DFS 的狀態往哪個方向流(往下還是往上),以及建立在這個基礎上的 11 個結構化模板。
練習 13/20 ok · 5 again · 下一題: LC 572, LC 222, LC 652
圖論
BFS 的主要參考文件:佇列模板、逐層展開、格子與多源 BFS,以及為什麼在無權圖上「第一次拜訪」就等於最短路徑;較重的變形與大量解題範例則各自放在自己的文件裡。
練習 4/13 ok · 3 again · 下一題: LC 542, LC 785, LC 752
圖論
DFS 的主文件:十個核心的深度優先模板 — 樹走訪、網格填色(flood fill)、路徑搜尋、回溯、樹結構修改、後序彙總、邊界消除、形狀簽名與帶權邊走訪 — 並附上用來挑選模板的辨識表。
練習 9/20 ok · 7 again · 下一題: LC 417, LC 124, LC 101
樹與堆積
堆積(heap,這個資料結構)以及它所實作的優先佇列(priority queue,這個抽象資料型別),Python 與 Java 兩種語言。本檔案原本拆成 heap.md + priority_queue.md,兩邊把同樣的題目各解了一遍。
練習 5/18 ok · 6 again · 下一題: LC 347, LC 23, LC 703
動態規劃與遞迴
DP 的主文件 — 狀態設計、模式目錄,以及每個必會 DP 家族各一份標準模板;實作解法庫、冷門技巧,以及五個最重的子題目都各自獨立成篇,從這裡連過去。
練習 11/30 ok · 14 again · 下一題: LC 91, LC 139, LC 300
陣列與字串
日常字串目錄 — 字元層級的雙指標掃描、頻率與 anagram 簽章、run-length 分組、切詞、解析與原地改寫 — 至於題解倉庫、語言層級的字串 API、回文、子字串搜尋與雙序列 DP,則各自有自己的一張表。
練習 3/13 ok · 3 again · 下一題: LC 696, LC 388, LC 71
雜湊、堆疊與佇列
LIFO 的基本功,加上堆疊的經典模板:括號配對、min-stack、單調堆疊的精簡版、用顯式堆疊做走訪,以及作用域/上下文帳本。
練習 2/12 ok · 5 again · 下一題: LC 155, LC 232, LC 636
鏈結串列
單向與雙向鏈結串列的指標手術:反轉、合併、重排、虛擬頭節點技巧,以及環的處理。
練習 4/23 ok · 10 again · 下一題: LC 206, LC 19, LC 143
樹與堆積
只談有序的樹 —— left < root < right 這條不變式換來了什麼(O(log n) 搜尋、中序即排序、依範圍剪枝、順序統計)。
練習 4/12 ok · 5 again · 下一題: LC 230, LC 450, LC 669
樹與堆積
樹的概念、樹的種類,以及走訪順序的策略 — 講的是為什麼與選哪個,再加上在這裡講解的進階技巧(Morris 穿線、倍增法,以及換根 DP,LC 834 的家)。各模式的二元樹模板放在 tree2.md。
練習 4/10 ok · 2 again · 下一題: LC 297, LC 99, LC 114
樹與堆積
最近共同祖先、節點間距離、父節點表(雙向)走訪,以及根到葉的路徑模板——所有答案是一條路徑或一個交會點、而不是某種形狀的樹問題。
練習 8/14 ok · 5 again · 下一題: LC 124, LC 437, LC 1644
圖論
圖的表示法、走訪、連通性、環偵測,以及一般圖題的完整目錄。
練習 9/18 ok · 3 again · 下一題: LC 269, LC 785, LC 721
搜尋與排序
針對一個候選答案的範圍,搭配單調的可行性判定式做二分搜尋 — canFinish / isValid 的寫法、「最小化最大值 vs 最大化最小值」的取捨、[max(nums), sum(nums)] 邊界配方,以及在值域上做計數的判定式。
練習 3/14 ok · 5 again · 下一題: LC 1552, LC 378, LC 2616
動態規劃與遞迴
用中文把 0/1 背包從「物品重量價值」一路講到 LC 494/416 的解題流程,重點放在狀態怎麼定義、「拿或不拿」的轉移、以及為什麼內層迴圈一定要倒序;完全背包(Unbounded)與排列/組合的迴圈順序規則不在這裡展開。
動態規劃與遞迴
帶「復原」動作的系統性搜尋:choose/explore/un-choose 骨架、start_idx 的控制、跳過重複、剪枝,以及每個必會題型剛好一份的標準模板 — 大量的實作解答與 hard 級的帶狀態模板放在兩個衛星檔裡。
練習 4/23 ok · 5 again · 下一題: LC 39, LC 17, LC 131
動態規劃與遞迴
完整的背包問題家族:0/1 vs 完全背包(unbounded)vs 有界背包(bounded)vs 分組背包(group)、子集合和(subset-sum)的化簡、為什麼 0/1 的內層迴圈要倒序,以及區分組合與排列的迴圈順序規則。
練習 2/13 ok · 6 again · 下一題: LC 322, LC 416, LC 279
語言工具箱
每一個 Python 內建與容器操作實際上要花多少成本,以及為什麼:內建函式、list、str、dict/set、tuple、deque、heapq、bisect 與 int 的逐項查表,每個成本背後的 CPython 記憶體排版,以及那七個會悄悄把 O(n) 解法變成 O(n²) 的寫法。
出現頻率高到「這裡有缺口就會掉關」的程度。
陣列與字串
matrix.md 背後的題解庫:十七道題,依各自吃的幾何性質或技巧分組 —— 走訪順序、原地變換、階梯搜尋、格子搜尋、二維 DP,以及列對壓縮。
陣列與字串
把二維格子當成一個獨立主題來看 —— 走訪的幾何(螺旋、對角、旋轉、轉置)、原地標記,以及索引↔座標的換算。
陣列與字串
專門講 k-sum 這個題型家族:從 2Sum 到 kSum、先排序再雙向收斂的遞迴寫法,以及重複值的處理。
陣列與字串
回文題型家族:中心擴散、雙指標驗證、回文 DP、Manacher,以及怎麼判斷一題該用哪一種。
陣列與字串
前綴和/累積和 — 子陣列和、二維前綴和、前綴和搭配雜湊表做計數。
陣列與字串
六個需要借用其他結構或其他恆等式的前綴和模板:補集技巧、應付含負數陣列的單調雙端佇列、二維的列對壓縮、前綴 XOR、用雜湊表實作的稀疏差分陣列,以及樹上前綴和的計數表。
陣列與字串
收錄不是模板錨點題的字串 LeetCode 實戰題,每題都寫成一張題目卡,歸檔到它所歸約的 string.md 模板底下;概念、模式卡與錨點題本身都留在主字串文件。
陣列與字串
不屬於任何模板錨定題的滑動視窗 LeetCode 實作題,每題一張題目卡,依它歸約到的主文件模板歸檔;模板、概念與決策表都留在滑動視窗主文件。
陣列與字串
第一輪可以先跳過的滑動視窗技巧:至多 K 個相異的家族、帶禁用元素重置或一次掃描的恰好 K 計數、同時處理多個不重疊的視窗,以及以單字而非字元為鍵的視窗;七個必會模板留在主文件,而由別份文件負責的進階型態(雙端佇列求極值、補集視窗、數值分桶)在這裡只留指引。
陣列與字串
array.md 自己那些模板(索引當雜湊、一次掃描的即時狀態)背後的題目,每題都放在它歸約到的卡片底下;歸屬在別份文件的陣列標籤題,在這裡只留一列指標。
陣列與字串
雙指標的 LeetCode 實作題庫,每題一份標準解,依它歸約到的雙指標主文件模板分組;概念、指標種類與模板本身留在雙指標主文件裡。
雜湊、堆疊與佇列
跨容器的選型指南:什麼工作該用哪個 Java/Python 容器,以及各自的 API 陷阱。
雜湊、堆疊與佇列
FIFO 的基本功:BFS 佇列、雙端佇列、環形緩衝區,以及以佇列為底的設計題。
雜湊、堆疊與佇列
stack.md 背後的題庫:不是任何模板錨點題的堆疊題,各自以題目卡的形式放在它所歸約到的模板底下;單調堆疊題在 monotonic_stack.md 裡完整解出,這裡只放指向它們的連結。
雜湊、堆疊與佇列
用堆疊解運算式的題型家族:計算機三兄弟(LC 224 / 227 / 772)、decode-string 式的巢狀(LC 394),以及後綴/依序運算元求值(LC 150、682),還有讓運算子優先序自然浮現的 pre_op 延遲插入技巧。
雜湊、堆疊與佇列
next greater/previous smaller/span/直方圖這類題目 — 堆疊本身保持有序,所以每個元素只被推入與彈出一次。
雜湊、堆疊與佇列
雜湊表家族的經典 LC 題目,寫成題目卡,各自歸在它所歸約到的 hash_map.md 模板底下;本檔沒有自己的模板。
鏈結串列
走在鏈結串列節點上的雙指標:快慢指標找環、找中點、找倒數第 k 個、以及固定間距指標。不談陣列索引。
鏈結串列
linked_list.md 背後的題目集:每題歸檔在它歸約到的核心模板之下,寫成一張題目卡,點出它多加的那一步;模板本身與各模板的錨點題都放在核心文件。
樹與堆積
在 bst.md 某個模板上多加一步的 BST 題,每題以一張題目卡寫一次,放在它歸約到的那張卡底下;模板或進階卡已經寫出的題目,這裡只列指標、不重解。
樹與堆積
第一輪可以先跳過的 BST 內容:O(h) 空間的延遲式迭代器、用中序下降點找出被破壞的 BST、順序統計(rank)查詢,以及有序陣列以外的各種建構變形 —— 每一項都附上什麼時候用 bst.md 那張較簡單的卡就夠了。
樹與堆積
堆積/優先佇列(priority queue)家族的題目集:每題都歸到它所化約成的 heap.md 模板之下,並寫出它額外多出的那一步;模板本身,以及需要進階技巧的題目,放在相鄰的文件裡。
樹與堆積
前綴樹 — insert/search/startsWith、節點該怎麼擺,以及那些「共用前綴」就是全部訣竅的題目(自動補完、單字搜尋、XOR trie)。
樹與堆積
把樹變成字串、再變回來 — 用子樹指紋做身分辨識與重複偵測,以及完整的編碼/解碼家族(括號式、逗號加 null 標記、深度前綴)。
樹與堆積
從扁平的東西把二元樹建起來:兩組走訪陣列、單一陣列上的索引區間,或是帶括號/中序的字串 — 也就是所有「只讀取樹」的題目的反方向。
樹與堆積
從每個樹的模式連到教它的那一張卡片的索引,再加上核心表單沒寫出來的幾種走訪:迭代的前序與後序、之字形層序、左下角的值,以及垂直順序。
練習 0/8 ok · 下一題: LC 144, LC 145, LC 103
樹與堆積
第一輪複習可以先跳過的堆積模式:延遲刪除、掃描線的「存活」堆積、後悔貪婪、資源池配置器、格子圖上的最佳優先搜尋,以及二元堆積之外的結構;六個必背模板留在母文件裡。
圖論
Dijkstra.md 背後的解題實作庫:十一題、兩種語言,依「搜尋狀態長什麼樣」分組,因為那正是決定你需要 dist[]、需要第二個狀態維度、還是一個單純 visited[] 的關鍵。
圖論
用優先佇列解非負權重的單源最短路徑。
圖論
併查集(disjoint set union)——無向圖的連通性、連通元件計數、環偵測,搭配路徑壓縮與按秩合併。
圖論
為 DAG 排序 — Kahn 的 BFS 解法、DFS 後序、環的偵測,以及建構在它們之上的排程類題目。
圖論
topology_sorting.md 背後的題目集:每題一張 problem card,依照它歸約到的模板分組,本身不放任何模板或理論。
搜尋與排序
O(N log N) 最長遞增子序列背後的紙牌遊戲演算法:牌堆、牌堆收斂成的 tails 陣列、如何還原子序列本身,以及可以歸約到它的題目家族。
搜尋與排序
以分割(partition)為基礎的選擇演算法:只保留 quicksort 分割後的其中一側,在平均 O(n) 時間內找出第 k 大、第 k 小或最接近的 k 個元素;也收它可用的各種分割方式,以及讓最壞情況變成線性的 median-of-medians pivot。LC 215 的 quickselect 解法以這裡為主場;堆積解法在 heap.md。
練習 3/9 ok · 1 again · 下一題: LC 347, LC 1985, LC 1337
搜尋與排序
binary_search.md 的題組:每題歸檔在它所歸約的索引空間模板底下,寫成一張題目卡、一份標準解,另外收錄少數沒在 binary_search_on_answer.md 解過的答案空間題。
搜尋與排序
排序(sorting)演算法與周邊技巧 — 比較式排序與其穩定性、計數/桶/基數排序、quickselect、自訂比較器,以及循環排序(cyclic sort)。
動態規劃與遞迴
模板索引:每個經典 DP 模式各佔一小節(Kadane、LIS、MCM、LCS、背包、狀態機、格子、位元遮罩、數位、樹上 DP、正規表達式、加權區間排程、切分、記憶化 DAG)。
動態規劃與遞迴
為什麼自底向上 DP 的迴圈巢狀與方向是由它自己的轉移式所決定的、錯誤順序會失敗的四種方式,以及用五種順序實作 LC 139 Word Break——包括那個看起來正確、能通過 "leetcode"、卻悄悄在題目自己的 Example 2 上失敗的寫法。
動態規劃與遞迴
DP 的附錄——第一輪該跳過的技巧:賽局理論/minimax DP、樹形與換根 DP、區間與字串 DP 的深入探討、機率與按步數計數的 DP、單調佇列與單調堆疊承載的 DP,以及從主表裁掉的長篇推導。
動態規劃與遞迴
在一或兩個字串上做的 DP:dp[m+1][n+1] 的雙序列網格、以前綴為基礎(1-indexed)的表格設計,以及 LCS、編輯距離、交錯字串、萬用字元/括號比對的完整範例。
動態規劃與遞迴
一套機械化的流程:遞迴 → 記憶化(memoization) → 表格化(tabulation) → 空間最佳化,一次套用在一題上。
動態規劃與遞迴
需要在遞迴中額外攜帶狀態的困難級回溯 — 一個 Trie 節點、前一個運算元、一份刪除額度 — 再加上約束傳播、記憶化搜尋,以及第一輪學習應該直接跳過的通用切分模板;必背的基本形狀不會在這裡重複。
動態規劃與遞迴
把遞迴當成一種機制來談:base case、往下傳的狀態 vs 往上回傳的結果、呼叫堆疊的成本,以及怎麼改寫成迭代。使用遞迴的那些題型家族各自有專屬檔案。
貪婪與區間
先排序再合併的區間題型 — 合併、插入、數重疊、最少刪除數。
貪婪與區間
每一步選當下最好的,以及證明這樣做安全的交換論證——區間排程、跳躍遊戲、任務分配——外加怎麼看出貪婪會失敗、必須改用 DP 的時機。
設計與模擬
低階設計那一關 — 類別建模、SOLID,以及面試官真的會問的設計模式(strategy、observer、factory、state),附完整的設計範例。
設計與模擬
design.md 背後的「設計一個 X」實作題,每題一張題目 card,依它逼出來的結構搭配(design.md 的模式)歸類。
設計與模擬
LC 的「設計一個 X」題型:從題目讀出必須支援的操作,再挑出能讓每個操作都做到 O(1) 或 O(log n) 的結構組合;實際寫出來的設計放在 examples 那一頁。
語言工具箱
Java 的 String 與 StringBuilder 操作 — 與 char[] 互轉、切片、解析、組字串與修改 — 加上所有跟 comparator 有關的東西:陣列、集合與 map 的排序,以及決定順序的回傳值規則。
語言工具箱
存放資料用的 Java 函式庫 API:陣列與二維陣列、list、map、佇列、堆積、堆疊與 pair — 每一種怎麼初始化、複製、走訪、索引,以及過程中的陷阱。
語言工具箱
決定「正確的演算法會不會算出正確答案」的那些 Java 語言語意:字元其實是整數、傳值與傳參考的差別,以及整數運算。函式庫 API 則放在另外兩份姊妹速查表。
語言工具箱
解題過程中會用到的 Python 語言慣用寫法 — 複製、字串處理、排序 key、整數運算、生成式(comprehension)與作用域 — 依「你想做什麼」來分組。標準函式庫、索引運算與各項操作的成本另有專屬速查表。
語言工具箱
Python 解法「邏輯明明對了卻答錯」的兩大元凶:插入到底落在哪一格,以及一段索引區間指的是「個數」還是「距離」。
語言工具箱
逐個函式庫的參考手冊:heapq、sortedcontainers、內建排序(sorted / list.sort)、bisect、collections、itertools、functools 與 datetime——每個呼叫、它們的複雜度,以及各自是為了取代哪一種手寫寫法而存在。
面試方法論
逐題解析 — 怎麼替一份真實的 LC 解答論證複雜度,每個技巧配一道經典題。
固定會出現,多半是五星模式的變形。
陣列與字串
prefix_sum.md 背後的解題存檔:八道模板無法從頭到尾解掉的題目,依照它們需要哪種前綴和形狀分組。
陣列與字串
字串的語言層機制:Python 的切片與方法、Java 的 String 與 StringBuilder、字元分類與大小寫轉換、字元算術、split/join 的陷阱,以及建構字串的效能守則——不談使用它們的演算法。
陣列與字串
只談子字串搜尋 — KMP 的失敗函數、Rabin-Karp rolling hash,以及「內建 indexOf vs KMP vs hash」該怎麼選。
陣列與字串
O(1) 區間更新、O(n) 重建 — 前綴和的反操作。
陣列與字串
逐位數相加,涵蓋面試官會丟給你的四種輸入形式:字串、整數、陣列、鏈結串列。
雜湊、堆疊與佇列
set.md 背後的解法檔案庫:十四題,依「這個集合到底被拿來做什麼」分組 — 記住看過什麼、集合運算、用 O(1) 索引取代掃描,或是當成更大演算法裡的一個零件。
雜湊、堆疊與佇列
成員判斷、去重與集合運算 — 只需要知道元素「在不在」、不需要對應值的題目。
雜湊、堆疊與佇列
用一個維持單調性的雙端佇列,以攤還 O(1) 的成本求滑動視窗的最大/最小值。
雜湊、堆疊與佇列
雜湊的內部原理與計數慣用手法 — 雜湊函式設計、碰撞、頻率表、滾動雜湊、自訂鍵。
樹與堆積
trie.md 背後的題解倉庫:五道題,從把結構蓋出來,一路到在格子上搜尋——字典樹把「每個單字各走一次」壓成「只走一趟」。
樹與堆積
堆積在語言層面的機械細節:heapq 和 PriorityQueue 你會用到的每個呼叫、怎麼假造出最大堆積、怎麼在不 pop 的情況下偷看堆頂,以及「只有部分有序」的容器會帶來哪些陷阱;用到這些 API 的演算法本身,放在其他堆積的表單裡。
樹與堆積
binary_tree.md 各模板的二元樹題目集:每題歸在它化約到的模板底下,只寫它多出來的那一步,模板本身不在這裡重講。
樹與堆積
樹的路徑問題背後那套「選擇 / 探索 / 復原」骨架,以及每題各自帶著的路徑狀態,外加根到葉卡片沒涵蓋的變形:通往單一節點的路徑(LC 236)、隱式的樹(LC 386、LC 388);根到葉的卡片本身放在 tree_lca_distance.md。
圖論
BFS 的題目集:每一題經典的逐層、多源、狀態空間與「把樹當成圖」的題目各一張 problem card,各自歸在它所歸約到的 bfs.md 模板之下 —— 這裡不教任何自己的模板。
圖論
第一輪可以先跳過的 BFS 技巧:雙向 BFS、搭配 deque 的 0-1 BFS、超出標準模板的多源 BFS、在隱式或擴充狀態空間上的 BFS,以及列舉所有最短路徑的 DAG —— 必會的佇列模板留在主文件。
圖論
dfs.md 的題庫:它的模板能解的 DFS 題目,每題一張題目卡,歸在它所歸約到的模板底下;題目若在別份文件裡完整解過,這裡只留一列指標。
圖論
第一輪複習可以先跳過的冷門 DFS 技巧:雙網格驗證、邊方向追蹤、跨連通分量的配對計數、字典樹配萬用字元搜尋、後序距離桶與 N 元樹彙總,以及以縮排或 parent[] 陣列形式給出的樹。真正的圖論(Tarjan、尤拉路徑)在 graph_advanced.md。
圖論
無向加權圖上的最小生成樹:切割性質、Kruskal 演算法(排序好的邊 + 併查集)與 Prim 演算法(heap 或稠密陣列),各自附逐步追蹤與變形,以及建立在它們之上的題型 — 完全幾何圖、虛擬源點、關鍵邊與瓶頸樹。
圖論
只做選型判斷,也是最短路徑比較唯一的家 — 哪種題型該用哪個最短路徑演算法,以及直覺選法在哪裡會錯;Dijkstra.md、Bellman-Ford.md 和 Floyd-Warshall.md 不再各留一份比較表,而是指到這裡。不放完整實作。
圖論
union_find.md 背後的解題檔案庫:十七道題,依「一個節點代表什麼」分組——頂點、格子,或帶比值的變數——因為題目之間變的就只有這件事。
圖論
graph.md 的題目集:每題一張 problem card,依照它歸約到的 graph.md 模板分組,本身不放任何模板或理論。
圖論
只是一份決策文件 —— 拓撲排序 vs 併查集:各自回答什麼問題、直覺選錯的地方在哪,以及兩者都能解的題目。
圖論
第一輪面試準備可以先跳過的圖論技巧:Tarjan 的 low-link 家族(強連通分量、橋、關節點)、Euler 路徑與迴路,以及二分圖的延伸主題 — 奇偶併查集、最大匹配(以及它的最大流觀點)和貪婪 k-著色。
搜尋與排序
合併排序以外的分治法 —— 那些「遞迴 + 合併」的形狀(邊排序邊計數、最近點對、矩陣分治、運算式分治)以及它們的遞迴式。
動態規劃與遞迴
LC 121/122/123/188/309/714 這個買賣家族,全部統一到同一個 dp[i][k][hold] 狀態機底下。
動態規劃與遞迴
不是模板錨定題的經典 DP 題(LC 343、91、62、279、276、1137),每一題都是一張 problem card,歸檔在它所歸約到的 dp.md 模板底下,再加上一份「其他常見 DP 題在哪裡有完整解」的索引;本身不放模板也不談理論。
動態規劃與遞迴
深入最大子陣列這個題型家族:Kadane 本體與它的各種變形(乘積、環狀、可刪除一個元素、二維)。
動態規劃與遞迴
狀態是「一個用整數編碼的子集合」的 DP:遮罩運算、子遮罩列舉、TSP 與指派問題的模板,以及 n <= 20 這條規模上限。
動態規劃與遞迴
單調堆疊上還掛著一個 DP 值的題型:「這個元素能撐過幾輪」、直方圖最大矩形那類面積 DP,以及最大正方形/計算正方形數量的網格遞迴式。
動態規劃與遞迴
不是模板錨定題的那些回溯題(LC 17、784、996、93、140、980、22),每一題都是一張 problem card,歸檔在它所歸約到的 backtrack.md 模板底下;錨定題本身在那邊自己的 card 上解,這份不教任何自己的模板。
貪婪與區間
scanning_line.md 背後的完整解題檔案:六道題目,依「掃描究竟在數什麼」分組 — 重疊深度、加權總和、存活工作的堆積,或兩個有序清單的交集。
貪婪與區間
掃描線:把每個區間轉成 +1 / -1 事件,依座標排序,掃過一次。
貪婪與區間
greedy.md 背後的題解倉庫:十四題,依貪婪選擇的形狀分組 — 往前延伸可達範圍、累積後歸零、依頻率交錯、排序後取走,或邊掃邊定案。
區間查詢與進階結構
支援區間查詢+區間更新的結構 —— 線段樹(segment tree)、懶惰標記(lazy propagation),以及 BIT vs 線段樹 vs 合併排序該怎麼選。
區間查詢與進階結構
專講 Fenwick 樹:i & -i 的索引運算、單點更新 + 前綴查詢,以及用它最俐落的那些題目。
數學與位元運算
bit_manipulation.md 背後的題解檔案庫:十九題,依照它們吃到位元運算子的哪個性質分組 —— XOR 把成對元素抵銷、清掉最低的 set bit、不用進位的算術、用一個整數代表一個子集合,或是親手打造遮罩來改寫一段位元欄位。
數學與位元運算
整數在位元層次上是怎麼被表示的(二補數、固定位寬、位移),以及建立在其上的各種運算與技巧:遮罩、XOR 恆等式、最低位 1、子集列舉,還有 bitmask DP。
數學與位元運算
面試中的數值操作 — 取位數、避免溢位的算術、進位轉換、開根號與次方。公式層級的計數則在隔壁那份。
設計與模擬
迭代器契約:hasNext/next 搭配延遲狀態、攤平、預看與合併,單一觀念獨立成篇。
設計與模擬
那些會被當成「寫程式題」來考的分散式系統模式:一致性雜湊、token bucket 與 leaky bucket 限流、以及各種負載平衡演算法,附上可直接跑的實作,以及面試官一定會追問的取捨。
語言工具箱
那些會悄悄害你 submission 掛掉的 Python 行為:可變預設參數、closure 的延遲綁定、整數快取、複製語意,再加上 GIL 與 Python 的並行處理全貌。
面試方法論
20 道自我測驗題 — 讀程式片段、說出複雜度、再對答案檢查自己。
面試少見 — 讀過一次即可,除非目標公司已知會問。
陣列與字串
比較重的字串工具:後綴結構、Z-algorithm、Manacher,以及字串 DP — 這些對主字串文件來說太專門的部分。
樹與堆積
僅作轉址。 本檔已併入 heap.md,留著只是為了把舊連結導向正確的章節。
圖論
容得下負權重、而且能偵測負環的單源最短路徑演算法,另外還有限制跳數(k hop)的變形。
圖論
用「中繼頂點」做 DP 求全點對最短路徑 — O(V³)、稠密圖、遞移閉包。
搜尋與排序
僅作轉址。 這份文件在 2026 年 11 月改名為 quickselect.md,留著只是為了把舊連結導向正確的章節。
動態規劃與遞迴
數出某個區間內有多少數字滿足「逐位」的性質:tight/started/位置這組狀態、通用的 top-down 模板,以及 count(R) - count(L-1) 這個區間技巧。
貪婪與區間
只講一件事 — 區間重疊的判定式:閉區間 [a,b] vs 半開區間 [a,b),以及每一題 LC 各需要哪一種。
貪婪與區間
僅作轉址。 這份文件在 2026 年 11 月改名為 array_overlap_explanation.md,修正拼錯的檔名;留著只是為了把舊連結導向正確的章節。
區間查詢與進階結構
被限制在單趟掃描與次線性記憶體之下的演算法 —— 蓄水池抽樣、Boyer-Moore 多數投票、加權隨機挑選,以及近似計數。
區間查詢與進階結構
輸入放不進 RAM 時該怎麼做:位元向量、先分桶再細化的多趟掃描、依雜湊切分檔案,以及外部合併排序——這些技巧以多掃幾趟為代價,仍能回傳精確答案。
數學與位元運算
解腦筋急轉彎類題目的四個招式:計算一次測試能買到多少資訊、平衡最壞情況、找出不變量,以及運用期望值的線性性。本篇教的是招式,而不是謎題清單。
數學與位元運算
面試會考到的計數與數論:模運算、GCD/LCM、篩法、nCr、蓄水池抽樣,以及基本幾何。
設計與模擬
L4 以上會出現的少數幾題 Java 並行題:依序列印、生產者/消費者、讀寫協調與死結避免,以及它們會用到的同步原語。
設計與模擬
那種「答案就是忠實地一步步跑完」的題目:狀態機、機器人/格子上的行走、遊戲回合、迭代改寫,外加怎麼讓這種程式碼不要爆長。
面試方法論
指向 wisdompeak 的題目分類表,並把它的 29 個分類對應到本 repo 中負責教它的那份 cheatsheet。分類表本身不在這裡複製一份。
面試方法論
轉址頁。原本的六步面試流程已經搬進 lc_pattern.md,那才是你開始解題時真正會打開的那一頁。
面試中出現頻率最高的一塊。先把這裡的四大模式家族練熟,再談其他。
日常字串目錄 — 字元層級的雙指標掃描、頻率與 anagram 簽章、run-length 分組、切詞、解析與原地改寫 — 至於題解倉庫、語言層級的字串 API、回文、子字串搜尋與雙序列 DP,則各自有自己的一張表。
練習 3/13 ok · 3 again · 下一題: LC 696, LC 388, LC 71
依條件伸縮的視窗 — 固定大小、可變大小、至多 k 個,以及用相減湊出的恰好 k 個;擴張/收縮迴圈與七個標準視窗模板都歸這裡管。
練習 5/14 ok · 4 again · 下一題: LC 438, LC 4067, LC 992
陣列的基本功——原地改寫、旋轉、分割,以及「用索引當雜湊」的招式。它擁有這些操作本身;至於各個模式家族(視窗、指標、前綴和)各有自己的檔案。
練習 4/15 ok · 3 again · 下一題: LC 88, LC 2657, LC 41
陣列與字串上的雙指標家族:兩端向內收斂、快慢指標、從中心擴張、讀寫分離的原地重寫,每一種各給一個標準模板;依條件伸縮的視窗題不在這裡。
練習 8/16 ok · 4 again · 下一題: LC 5, LC 647, LC 88
matrix.md 背後的題解庫:十七道題,依各自吃的幾何性質或技巧分組 —— 走訪順序、原地變換、階梯搜尋、格子搜尋、二維 DP,以及列對壓縮。
把二維格子當成一個獨立主題來看 —— 走訪的幾何(螺旋、對角、旋轉、轉置)、原地標記,以及索引↔座標的換算。
專門講 k-sum 這個題型家族:從 2Sum 到 kSum、先排序再雙向收斂的遞迴寫法,以及重複值的處理。
回文題型家族:中心擴散、雙指標驗證、回文 DP、Manacher,以及怎麼判斷一題該用哪一種。
前綴和/累積和 — 子陣列和、二維前綴和、前綴和搭配雜湊表做計數。
六個需要借用其他結構或其他恆等式的前綴和模板:補集技巧、應付含負數陣列的單調雙端佇列、二維的列對壓縮、前綴 XOR、用雜湊表實作的稀疏差分陣列,以及樹上前綴和的計數表。
收錄不是模板錨點題的字串 LeetCode 實戰題,每題都寫成一張題目卡,歸檔到它所歸約的 string.md 模板底下;概念、模式卡與錨點題本身都留在主字串文件。
不屬於任何模板錨定題的滑動視窗 LeetCode 實作題,每題一張題目卡,依它歸約到的主文件模板歸檔;模板、概念與決策表都留在滑動視窗主文件。
第一輪可以先跳過的滑動視窗技巧:至多 K 個相異的家族、帶禁用元素重置或一次掃描的恰好 K 計數、同時處理多個不重疊的視窗,以及以單字而非字元為鍵的視窗;七個必會模板留在主文件,而由別份文件負責的進階型態(雙端佇列求極值、補集視窗、數值分桶)在這裡只留指引。
array.md 自己那些模板(索引當雜湊、一次掃描的即時狀態)背後的題目,每題都放在它歸約到的卡片底下;歸屬在別份文件的陣列標籤題,在這裡只留一列指標。
雙指標的 LeetCode 實作題庫,每題一份標準解,依它歸約到的雙指標主文件模板分組;概念、指標種類與模板本身留在雙指標主文件裡。
prefix_sum.md 背後的解題存檔:八道模板無法從頭到尾解掉的題目,依照它們需要哪種前綴和形狀分組。
字串的語言層機制:Python 的切片與方法、Java 的 String 與 StringBuilder、字元分類與大小寫轉換、字元算術、split/join 的陷阱,以及建構字串的效能守則——不談使用它們的演算法。
只談子字串搜尋 — KMP 的失敗函數、Rabin-Karp rolling hash,以及「內建 indexOf vs KMP vs hash」該怎麼選。
O(1) 區間更新、O(n) 重建 — 前綴和的反操作。
逐位數相加,涵蓋面試官會丟給你的四種輸入形式:字串、整數、陣列、鏈結串列。
比較重的字串工具:後綴結構、Z-algorithm、Manacher,以及字串 DP — 這些對主字串文件來說太專門的部分。
O(1) 查找加上 LIFO/FIFO 的紀律 — 把 O(n^2) 掃描壓成 O(n) 的那組結構。
鍵→值的題型模式:查找、分組、索引表、前綴和表、重新映射。
練習 5/16 ok · 4 again · 下一題: LC 347, LC 146, LC 438
LIFO 的基本功,加上堆疊的經典模板:括號配對、min-stack、單調堆疊的精簡版、用顯式堆疊做走訪,以及作用域/上下文帳本。
練習 2/12 ok · 5 again · 下一題: LC 155, LC 232, LC 636
跨容器的選型指南:什麼工作該用哪個 Java/Python 容器,以及各自的 API 陷阱。
FIFO 的基本功:BFS 佇列、雙端佇列、環形緩衝區,以及以佇列為底的設計題。
stack.md 背後的題庫:不是任何模板錨點題的堆疊題,各自以題目卡的形式放在它所歸約到的模板底下;單調堆疊題在 monotonic_stack.md 裡完整解出,這裡只放指向它們的連結。
用堆疊解運算式的題型家族:計算機三兄弟(LC 224 / 227 / 772)、decode-string 式的巢狀(LC 394),以及後綴/依序運算元求值(LC 150、682),還有讓運算子優先序自然浮現的 pre_op 延遲插入技巧。
next greater/previous smaller/span/直方圖這類題目 — 堆疊本身保持有序,所以每個元素只被推入與彈出一次。
雜湊表家族的經典 LC 題目,寫成題目卡,各自歸在它所歸約到的 hash_map.md 模板底下;本檔沒有自己的模板。
set.md 背後的解法檔案庫:十四題,依「這個集合到底被拿來做什麼」分組 — 記住看過什麼、集合運算、用 O(1) 索引取代掃描,或是當成更大演算法裡的一個零件。
成員判斷、去重與集合運算 — 只需要知道元素「在不在」、不需要對應值的題目。
用一個維持單調性的雙端佇列,以攤還 O(1) 的成本求滑動視窗的最大/最小值。
雜湊的內部原理與計數慣用手法 — 雜湊函式設計、碰撞、頻率表、滾動雜湊、自訂鍵。
指標手術。概念不深,但對實作精準度的要求很高。
單向與雙向鏈結串列的指標手術:反轉、合併、重排、虛擬頭節點技巧,以及環的處理。
練習 4/23 ok · 10 again · 下一題: LC 206, LC 19, LC 143
走在鏈結串列節點上的雙指標:快慢指標找環、找中點、找倒數第 k 個、以及固定間距指標。不談陣列索引。
linked_list.md 背後的題目集:每題歸檔在它歸約到的核心模板之下,寫成一張題目卡,點出它多加的那一步;模板本身與各模板的錨點題都放在核心文件。
遞迴結構加上有序存取。所有標記為樹/堆積的面試題,大約四分之一出自這五份文件。
只談有序的樹 —— left < root < right 這條不變式換來了什麼(O(log n) 搜尋、中序即排序、依範圍剪枝、順序統計)。
練習 4/12 ok · 5 again · 下一題: LC 230, LC 450, LC 669
二元樹特有的思路:DFS 的狀態往哪個方向流(往下還是往上),以及建立在這個基礎上的 11 個結構化模板。
練習 13/20 ok · 5 again · 下一題: LC 572, LC 222, LC 652
堆積(heap,這個資料結構)以及它所實作的優先佇列(priority queue,這個抽象資料型別),Python 與 Java 兩種語言。本檔案原本拆成 heap.md + priority_queue.md,兩邊把同樣的題目各解了一遍。
練習 5/18 ok · 6 again · 下一題: LC 347, LC 23, LC 703
樹的概念、樹的種類,以及走訪順序的策略 — 講的是為什麼與選哪個,再加上在這裡講解的進階技巧(Morris 穿線、倍增法,以及換根 DP,LC 834 的家)。各模式的二元樹模板放在 tree2.md。
練習 4/10 ok · 2 again · 下一題: LC 297, LC 99, LC 114
最近共同祖先、節點間距離、父節點表(雙向)走訪,以及根到葉的路徑模板——所有答案是一條路徑或一個交會點、而不是某種形狀的樹問題。
練習 8/14 ok · 5 again · 下一題: LC 124, LC 437, LC 1644
在 bst.md 某個模板上多加一步的 BST 題,每題以一張題目卡寫一次,放在它歸約到的那張卡底下;模板或進階卡已經寫出的題目,這裡只列指標、不重解。
第一輪可以先跳過的 BST 內容:O(h) 空間的延遲式迭代器、用中序下降點找出被破壞的 BST、順序統計(rank)查詢,以及有序陣列以外的各種建構變形 —— 每一項都附上什麼時候用 bst.md 那張較簡單的卡就夠了。
堆積/優先佇列(priority queue)家族的題目集:每題都歸到它所化約成的 heap.md 模板之下,並寫出它額外多出的那一步;模板本身,以及需要進階技巧的題目,放在相鄰的文件裡。
前綴樹 — insert/search/startsWith、節點該怎麼擺,以及那些「共用前綴」就是全部訣竅的題目(自動補完、單字搜尋、XOR trie)。
把樹變成字串、再變回來 — 用子樹指紋做身分辨識與重複偵測,以及完整的編碼/解碼家族(括號式、逗號加 null 標記、深度前綴)。
從扁平的東西把二元樹建起來:兩組走訪陣列、單一陣列上的索引區間,或是帶括號/中序的字串 — 也就是所有「只讀取樹」的題目的反方向。
從每個樹的模式連到教它的那一張卡片的索引,再加上核心表單沒寫出來的幾種走訪:迭代的前序與後序、之字形層序、左下角的值,以及垂直順序。
練習 0/8 ok · 下一題: LC 144, LC 145, LC 103
第一輪複習可以先跳過的堆積模式:延遲刪除、掃描線的「存活」堆積、後悔貪婪、資源池配置器、格子圖上的最佳優先搜尋,以及二元堆積之外的結構;六個必背模板留在母文件裡。
trie.md 背後的題解倉庫:五道題,從把結構蓋出來,一路到在格子上搜尋——字典樹把「每個單字各走一次」壓成「只走一趟」。
堆積在語言層面的機械細節:heapq 和 PriorityQueue 你會用到的每個呼叫、怎麼假造出最大堆積、怎麼在不 pop 的情況下偷看堆頂,以及「只有部分有序」的容器會帶來哪些陷阱;用到這些 API 的演算法本身,放在其他堆積的表單裡。
binary_tree.md 各模板的二元樹題目集:每題歸在它化約到的模板底下,只寫它多出來的那一步,模板本身不在這裡重講。
樹的路徑問題背後那套「選擇 / 探索 / 復原」骨架,以及每題各自帶著的路徑狀態,外加根到葉卡片沒涵蓋的變形:通往單一節點的路徑(LC 236)、隱式的樹(LC 386、LC 388);根到葉的卡片本身放在 tree_lca_distance.md。
僅作轉址。 本檔已併入 heap.md,留著只是為了把舊連結導向正確的章節。
走訪、連通性與排序。BFS/DFS 是必備;帶權最短路徑三本柱多半是 L5 以上才會碰。
BFS 的主要參考文件:佇列模板、逐層展開、格子與多源 BFS,以及為什麼在無權圖上「第一次拜訪」就等於最短路徑;較重的變形與大量解題範例則各自放在自己的文件裡。
練習 4/13 ok · 3 again · 下一題: LC 542, LC 785, LC 752
DFS 的主文件:十個核心的深度優先模板 — 樹走訪、網格填色(flood fill)、路徑搜尋、回溯、樹結構修改、後序彙總、邊界消除、形狀簽名與帶權邊走訪 — 並附上用來挑選模板的辨識表。
練習 9/20 ok · 7 again · 下一題: LC 417, LC 124, LC 101
圖的表示法、走訪、連通性、環偵測,以及一般圖題的完整目錄。
練習 9/18 ok · 3 again · 下一題: LC 269, LC 785, LC 721
Dijkstra.md 背後的解題實作庫:十一題、兩種語言,依「搜尋狀態長什麼樣」分組,因為那正是決定你需要 dist[]、需要第二個狀態維度、還是一個單純 visited[] 的關鍵。
用優先佇列解非負權重的單源最短路徑。
併查集(disjoint set union)——無向圖的連通性、連通元件計數、環偵測,搭配路徑壓縮與按秩合併。
為 DAG 排序 — Kahn 的 BFS 解法、DFS 後序、環的偵測,以及建構在它們之上的排程類題目。
topology_sorting.md 背後的題目集:每題一張 problem card,依照它歸約到的模板分組,本身不放任何模板或理論。
BFS 的題目集:每一題經典的逐層、多源、狀態空間與「把樹當成圖」的題目各一張 problem card,各自歸在它所歸約到的 bfs.md 模板之下 —— 這裡不教任何自己的模板。
第一輪可以先跳過的 BFS 技巧:雙向 BFS、搭配 deque 的 0-1 BFS、超出標準模板的多源 BFS、在隱式或擴充狀態空間上的 BFS,以及列舉所有最短路徑的 DAG —— 必會的佇列模板留在主文件。
dfs.md 的題庫:它的模板能解的 DFS 題目,每題一張題目卡,歸在它所歸約到的模板底下;題目若在別份文件裡完整解過,這裡只留一列指標。
第一輪複習可以先跳過的冷門 DFS 技巧:雙網格驗證、邊方向追蹤、跨連通分量的配對計數、字典樹配萬用字元搜尋、後序距離桶與 N 元樹彙總,以及以縮排或 parent[] 陣列形式給出的樹。真正的圖論(Tarjan、尤拉路徑)在 graph_advanced.md。
無向加權圖上的最小生成樹:切割性質、Kruskal 演算法(排序好的邊 + 併查集)與 Prim 演算法(heap 或稠密陣列),各自附逐步追蹤與變形,以及建立在它們之上的題型 — 完全幾何圖、虛擬源點、關鍵邊與瓶頸樹。
只做選型判斷,也是最短路徑比較唯一的家 — 哪種題型該用哪個最短路徑演算法,以及直覺選法在哪裡會錯;Dijkstra.md、Bellman-Ford.md 和 Floyd-Warshall.md 不再各留一份比較表,而是指到這裡。不放完整實作。
union_find.md 背後的解題檔案庫:十七道題,依「一個節點代表什麼」分組——頂點、格子,或帶比值的變數——因為題目之間變的就只有這件事。
graph.md 的題目集:每題一張 problem card,依照它歸約到的 graph.md 模板分組,本身不放任何模板或理論。
只是一份決策文件 —— 拓撲排序 vs 併查集:各自回答什麼問題、直覺選錯的地方在哪,以及兩者都能解的題目。
第一輪面試準備可以先跳過的圖論技巧:Tarjan 的 low-link 家族(強連通分量、橋、關節點)、Euler 路徑與迴路,以及二分圖的延伸主題 — 奇偶併查集、最大匹配(以及它的最大流觀點)和貪婪 k-著色。
容得下負權重、而且能偵測負環的單源最短路徑演算法,另外還有限制跳數(k hop)的變形。
用「中繼頂點」做 DP 求全點對最短路徑 — O(V³)、稠密圖、遞移閉包。
把單調空間對半砍,以及排序究竟買到了什麼。「對答案做二分搜尋」是最被低估的五星技巧。
對單調搜尋空間做折半 — l <= r 與 l < r 背後的迴圈不變式推理、邊界(lower / upper bound)模板、旋轉陣列,以及浮點數與二維搜尋。
練習 8/20 ok · 4 again · 下一題: LC 300, LC 35, LC 702
針對一個候選答案的範圍,搭配單調的可行性判定式做二分搜尋 — canFinish / isValid 的寫法、「最小化最大值 vs 最大化最小值」的取捨、[max(nums), sum(nums)] 邊界配方,以及在值域上做計數的判定式。
練習 3/14 ok · 5 again · 下一題: LC 1552, LC 378, LC 2616
O(N log N) 最長遞增子序列背後的紙牌遊戲演算法:牌堆、牌堆收斂成的 tails 陣列、如何還原子序列本身,以及可以歸約到它的題目家族。
以分割(partition)為基礎的選擇演算法:只保留 quicksort 分割後的其中一側,在平均 O(n) 時間內找出第 k 大、第 k 小或最接近的 k 個元素;也收它可用的各種分割方式,以及讓最壞情況變成線性的 median-of-medians pivot。LC 215 的 quickselect 解法以這裡為主場;堆積解法在 heap.md。
練習 3/9 ok · 1 again · 下一題: LC 347, LC 1985, LC 1337
binary_search.md 的題組:每題歸檔在它所歸約的索引空間模板底下,寫成一張題目卡、一份標準解,另外收錄少數沒在 binary_search_on_answer.md 解過的答案空間題。
排序(sorting)演算法與周邊技巧 — 比較式排序與其穩定性、計數/桶/基數排序、quickselect、自訂比較器,以及循環排序(cyclic sort)。
合併排序以外的分治法 —— 那些「遞迴 + 合併」的形狀(邊排序邊計數、最近點對、矩陣分治、運算式分治)以及它們的遞迴式。
僅作轉址。 這份文件在 2026 年 11 月改名為 quickselect.md,留著只是為了把舊連結導向正確的章節。
最硬的五星區塊。從遞迴出發,先記憶化,再改成表格。
用中文把 0/1 背包從「物品重量價值」一路講到 LC 494/416 的解題流程,重點放在狀態怎麼定義、「拿或不拿」的轉移、以及為什麼內層迴圈一定要倒序;完全背包(Unbounded)與排列/組合的迴圈順序規則不在這裡展開。
DP 的主文件 — 狀態設計、模式目錄,以及每個必會 DP 家族各一份標準模板;實作解法庫、冷門技巧,以及五個最重的子題目都各自獨立成篇,從這裡連過去。
練習 11/30 ok · 14 again · 下一題: LC 91, LC 139, LC 300
帶「復原」動作的系統性搜尋:choose/explore/un-choose 骨架、start_idx 的控制、跳過重複、剪枝,以及每個必會題型剛好一份的標準模板 — 大量的實作解答與 hard 級的帶狀態模板放在兩個衛星檔裡。
練習 4/23 ok · 5 again · 下一題: LC 39, LC 17, LC 131
完整的背包問題家族:0/1 vs 完全背包(unbounded)vs 有界背包(bounded)vs 分組背包(group)、子集合和(subset-sum)的化簡、為什麼 0/1 的內層迴圈要倒序,以及區分組合與排列的迴圈順序規則。
練習 2/13 ok · 6 again · 下一題: LC 322, LC 416, LC 279
模板索引:每個經典 DP 模式各佔一小節(Kadane、LIS、MCM、LCS、背包、狀態機、格子、位元遮罩、數位、樹上 DP、正規表達式、加權區間排程、切分、記憶化 DAG)。
為什麼自底向上 DP 的迴圈巢狀與方向是由它自己的轉移式所決定的、錯誤順序會失敗的四種方式,以及用五種順序實作 LC 139 Word Break——包括那個看起來正確、能通過 "leetcode"、卻悄悄在題目自己的 Example 2 上失敗的寫法。
DP 的附錄——第一輪該跳過的技巧:賽局理論/minimax DP、樹形與換根 DP、區間與字串 DP 的深入探討、機率與按步數計數的 DP、單調佇列與單調堆疊承載的 DP,以及從主表裁掉的長篇推導。
在一或兩個字串上做的 DP:dp[m+1][n+1] 的雙序列網格、以前綴為基礎(1-indexed)的表格設計,以及 LCS、編輯距離、交錯字串、萬用字元/括號比對的完整範例。
一套機械化的流程:遞迴 → 記憶化(memoization) → 表格化(tabulation) → 空間最佳化,一次套用在一題上。
需要在遞迴中額外攜帶狀態的困難級回溯 — 一個 Trie 節點、前一個運算元、一份刪除額度 — 再加上約束傳播、記憶化搜尋,以及第一輪學習應該直接跳過的通用切分模板;必背的基本形狀不會在這裡重複。
把遞迴當成一種機制來談:base case、往下傳的狀態 vs 往上回傳的結果、呼叫堆疊的成本,以及怎麼改寫成迭代。使用遞迴的那些題型家族各自有專屬檔案。
LC 121/122/123/188/309/714 這個買賣家族,全部統一到同一個 dp[i][k][hold] 狀態機底下。
不是模板錨定題的經典 DP 題(LC 343、91、62、279、276、1137),每一題都是一張 problem card,歸檔在它所歸約到的 dp.md 模板底下,再加上一份「其他常見 DP 題在哪裡有完整解」的索引;本身不放模板也不談理論。
深入最大子陣列這個題型家族:Kadane 本體與它的各種變形(乘積、環狀、可刪除一個元素、二維)。
狀態是「一個用整數編碼的子集合」的 DP:遮罩運算、子遮罩列舉、TSP 與指派問題的模板,以及 n <= 20 這條規模上限。
單調堆疊上還掛著一個 DP 值的題型:「這個元素能撐過幾輪」、直方圖最大矩形那類面積 DP,以及最大正方形/計算正方形數量的網格遞迴式。
不是模板錨定題的那些回溯題(LC 17、784、996、93、140、980、22),每一題都是一張 problem card,歸檔在它所歸約到的 backtrack.md 模板底下;錨定題本身在那邊自己的 card 上解,這份不教任何自己的模板。
數出某個區間內有多少數字滿足「逐位」的性質:tight/started/位置這組狀態、通用的 top-down 模板,以及 count(R) - count(L-1) 這個區間技巧。
先排序再掃描,以及證明它正確的交換論證。
先排序再合併的區間題型 — 合併、插入、數重疊、最少刪除數。
每一步選當下最好的,以及證明這樣做安全的交換論證——區間排程、跳躍遊戲、任務分配——外加怎麼看出貪婪會失敗、必須改用 DP 的時機。
scanning_line.md 背後的完整解題檔案:六道題目,依「掃描究竟在數什麼」分組 — 重疊深度、加權總和、存活工作的堆積,或兩個有序清單的交集。
掃描線:把每個區間轉成 +1 / -1 事件,依座標排序,掃過一次。
greedy.md 背後的題解倉庫:十四題,依貪婪選擇的形狀分組 — 往前延伸可達範圍、累積後歸零、依頻率交錯、排序後取走,或邊掃邊定案。
只講一件事 — 區間重疊的判定式:閉區間 [a,b] vs 半開區間 [a,b),以及每一題 LC 各需要哪一種。
僅作轉址。 這份文件在 2026 年 11 月改名為 array_overlap_explanation.md,修正拼錯的檔名;留著只是為了把舊連結導向正確的章節。
只有在題目同時需要「更新」和「區間查詢」時才動用這些 — 否則前綴和就夠了。
支援區間查詢+區間更新的結構 —— 線段樹(segment tree)、懶惰標記(lazy propagation),以及 BIT vs 線段樹 vs 合併排序該怎麼選。
專講 Fenwick 樹:i & -i 的索引運算、單點更新 + 前綴查詢,以及用它最俐落的那些題目。
被限制在單趟掃描與次線性記憶體之下的演算法 —— 蓄水池抽樣、Boyer-Moore 多數投票、加權隨機挑選,以及近似計數。
輸入放不進 RAM 時該怎麼做:位元向量、先分桶再細化的多趟掃描、依雜湊切分檔案,以及外部合併排序——這些技巧以多掃幾趟為代價,仍能回傳精確答案。
小而自足的主題。學習成本低,偶爾一題定生死。
bit_manipulation.md 背後的題解檔案庫:十九題,依照它們吃到位元運算子的哪個性質分組 —— XOR 把成對元素抵銷、清掉最低的 set bit、不用進位的算術、用一個整數代表一個子集合,或是親手打造遮罩來改寫一段位元欄位。
整數在位元層次上是怎麼被表示的(二補數、固定位寬、位移),以及建立在其上的各種運算與技巧:遮罩、XOR 恆等式、最低位 1、子集列舉,還有 bitmask DP。
面試中的數值操作 — 取位數、避免溢位的算術、進位轉換、開根號與次方。公式層級的計數則在隔壁那份。
解腦筋急轉彎類題目的四個招式:計算一次測試能買到多少資訊、平衡最壞情況、找出不變量,以及運用期望值的線性性。本篇教的是招式,而不是謎題清單。
面試會考到的計數與數論:模運算、GCD/LCM、篩法、nCr、蓄水池抽樣,以及基本幾何。
「設計一個 X」與低階設計關卡 — 評分看的是操作複雜度與類別建模,不是花招。
低階設計那一關 — 類別建模、SOLID,以及面試官真的會問的設計模式(strategy、observer、factory、state),附完整的設計範例。
design.md 背後的「設計一個 X」實作題,每題一張題目 card,依它逼出來的結構搭配(design.md 的模式)歸類。
LC 的「設計一個 X」題型:從題目讀出必須支援的操作,再挑出能讓每個操作都做到 O(1) 或 O(log n) 的結構組合;實際寫出來的設計放在 examples 那一頁。
迭代器契約:hasNext/next 搭配延遲狀態、攤平、預看與合併,單一觀念獨立成篇。
那些會被當成「寫程式題」來考的分散式系統模式:一致性雜湊、token bucket 與 leaky bucket 限流、以及各種負載平衡演算法,附上可直接跑的實作,以及面試官一定會追問的取捨。
L4 以上會出現的少數幾題 Java 並行題:依序列印、生產者/消費者、讀寫協調與死結避免,以及它們會用到的同步原語。
那種「答案就是忠實地一步步跑完」的題目:狀態機、機器人/格子上的行走、遊戲回合、迭代改寫,外加怎麼讓這種程式碼不要爆長。
語言機制,不是演算法。為了寫得快,也為了不再因為可避免的坑而掉 submission。
每一個 Python 內建與容器操作實際上要花多少成本,以及為什麼:內建函式、list、str、dict/set、tuple、deque、heapq、bisect 與 int 的逐項查表,每個成本背後的 CPython 記憶體排版,以及那七個會悄悄把 O(n) 解法變成 O(n²) 的寫法。
Java 的 String 與 StringBuilder 操作 — 與 char[] 互轉、切片、解析、組字串與修改 — 加上所有跟 comparator 有關的東西:陣列、集合與 map 的排序,以及決定順序的回傳值規則。
存放資料用的 Java 函式庫 API:陣列與二維陣列、list、map、佇列、堆積、堆疊與 pair — 每一種怎麼初始化、複製、走訪、索引,以及過程中的陷阱。
決定「正確的演算法會不會算出正確答案」的那些 Java 語言語意:字元其實是整數、傳值與傳參考的差別,以及整數運算。函式庫 API 則放在另外兩份姊妹速查表。
解題過程中會用到的 Python 語言慣用寫法 — 複製、字串處理、排序 key、整數運算、生成式(comprehension)與作用域 — 依「你想做什麼」來分組。標準函式庫、索引運算與各項操作的成本另有專屬速查表。
Python 解法「邏輯明明對了卻答錯」的兩大元凶:插入到底落在哪一格,以及一段索引區間指的是「個數」還是「距離」。
逐個函式庫的參考手冊:heapq、sortedcontainers、內建排序(sorted / list.sort)、bisect、collections、itertools、functools 與 datetime——每個呼叫、它們的複雜度,以及各自是為了取代哪一種手寫寫法而存在。
那些會悄悄害你 submission 掛掉的 Python 行為:可變預設參數、closure 的延遲綁定、整數快取、複製語意,再加上 GIL 與 Python 的並行處理全貌。
怎麼分類一道題、怎麼說出它的複雜度。第一次模擬面試前先讀。
入口:從題目敘述走到解它的那張 card — 敘述裡的訊號、限制條件的提示、模式、指向那張 card 的連結,以及長得像、其實不是的那一題。這裡只做路由:每個模板都在表格連到的 card 裡。
練習 14/27 ok · 11 again · 下一題: LC 206, LC 322, LC 347
查表用:每個常見資料結構與經典演算法的 Big-O,以及背後的數學直覺。
逐題解析 — 怎麼替一份真實的 LC 解答論證複雜度,每個技巧配一道經典題。
20 道自我測驗題 — 讀程式片段、說出複雜度、再對答案檢查自己。
指向 wisdompeak 的題目分類表,並把它的 29 個分類對應到本 repo 中負責教它的那份 cheatsheet。分類表本身不在這裡複製一份。
轉址頁。原本的六步面試流程已經搬進 lc_pattern.md,那才是你開始解題時真正會打開的那一頁。
沒有符合該條件的速查表。
使用方式:先挑主題,讀它的「範圍」那行確認這份文件確實涵蓋你的問題,再直接跳到標星的章節 —— 每份速查表內部值得背的章節也標了同一套星等。練習數字來自練習紀錄。
原始檔:GitHub 上的 i18n/zh — 星等與分組定義在 data/cheatsheet_meta.json。