Articles
LeetCode 75、Blind 75 與 Grind 75 怎麼選?依時間與弱項挑題單
LeetCode 75、Blind 75 與 Grind 75 怎麼選?依官方與原作者資料分清固定核心題單和可調整排程,再用十八小時預算扣除診斷、復習與模擬,計算真正的新題時間。透過二分搜尋、計數、圖與雙指標診斷弱項,選一條主線並補必要變化,不承諾三份全刷完、完成時間或錄取率,也不把工具估算當成公司限時。
LeetCode 75、Blind 75 與 Grind 75 怎麼選?先不要把問題變成「哪份比較神」。對求職者來說,更重要的是距離面試還有多少可用時間、哪些題型尚未理解,以及是否預留了重寫、變體與口頭解釋。三份名稱都有 75,不代表你需要依序完成三次。
如果你不知道弱項在哪,可以先用 旋轉排序陣列的二分搜尋練習觀察自己的澄清、推理、實作與測試。本文比較目前的官方/原作者資料,再用兩個原創工具幫你做決定:可用時間帳,以及題型診斷表。
先分清三份題單的身分
LeetCode 官方 LeetCode 75 頁面將它定位為 75 題的面試練習 study plan,並建議一至三個月的準備範圍。這是平台對計畫的定位,不是你的完成時間保證,也不表示 75 題涵蓋每間公司的所有面試面向。
Blind 75 原作者的題目頁說明,Blind 75 是他最初分享的精選題單;後來建立 Grind 75 以提供更可調整的規劃。該頁也有自己的分週選題建議,不應把頁面上的一份子集排程誤認為完整 Blind 75,或誤認為 LeetCode 官方的 75 題。
Grind 75 的目前介面允許調整週數、每週時數、難度與主題。它由較大的題目池產生安排;名稱不表示每組設定都一定只會給 75 題。頁面時間是作者的估計,不是你在真實面試的限時,更不是公司合格標準。
| 題單 | 主要用途 | 選擇前要確認 |
|---|---|---|
| LeetCode 75 | 在 LeetCode study plan 中走一條固定核心路線 | 自己是否有足夠的基礎與復習時間 |
| Blind 75 | 使用原作者精選核心作為緊湊檢查範圍 | 是否能理解模式,而不只是記住題名 |
| Grind 75 | 按時間、難度與主題調整安排 | 設定是否反映真實可用時數,是否看懂估算前提 |
這張表不是難度排行榜,也沒有比較錄取率。本文沒有逐題計算三份現行清單的交集,因此不提供「重複百分之多少」的數字。實際去重時,用題目 URL 或題號建立集合,而不是看到標題相似就當成同題。
名字相同,不代表練習成本相同
題目數是一種範圍描述,卻不是充分的時間預算。你可能用二十分鐘理解一題,但花更久才在不看解答的情況下重寫;另一題一開始就能完成,卻在條件改變時暴露演算法前提。
看解答、自己實作、間隔後重寫、講解與模擬,應分開記錄。若你把每次打開題目的時間都當成「一題完成」,月底的進度會看起來很好,但面試時仍可能無法說明為何某個指標只向右移動。
換題單有時是在迴避同一個弱點。二分搜尋的邊界在三份題單裡都可能需要練習;換一份清單不會自動修正無法寫出搜尋區間不變量的問題。相反地,若某份安排不符合你的程度,持續卡在超出先備知識的題目,也不必用完成率證明毅力。
因此先選一份主要路線,再用少量補題修正診斷出的缺口。主題單負責避免隨機選題,補題負責提供需要的變化;它們不需要各自成為一個新的「全部刷完」專案。
時間帳:十八小時不是十八小時新題
以下是原創的假設計算,不是任何平台的官方安排。假設你離面試還有三週,每週可以穩定使用六小時,總共是十八小時。先分配兩小時診斷、六小時重寫與復習、四小時模擬及檢討,剩下六小時才是新題時間。
公式是:新題可用時間 = 總時間 - 診斷 - 復習 - 模擬與檢討。在這個例子裡是 18 - 2 - 6 - 4 = 6 小時。若先拿十八小時去除每題解題時間,得到的題數會把必要的回想與表達練習全部擠掉。
假設你觀察到一個新題單元平均需要四十五分鐘,包括首次嘗試、檢查解答與修正;六小時大約能安排八個這樣的單元。這是個人排程估算,不是八題一定完成:有些問題應拆成先備知識與重寫,有些則很快就能跳過。
再做敏感度檢查。若工作突然變忙,只剩十二小時,但仍保留兩小時診斷、四小時復習與三小時模擬檢討,就只剩三小時新題。此時合理的調整是縮小新題範圍,不是讓所有復習都消失,繼續維持原本的完成數承諾。
如果時間表一直超支,先量一次自己的實際單元成本。將「卡住的五十分鐘」拆成讀題、想法、實作與定位錯誤,才能判斷是新模式需要學習,還是熟悉模式的語言操作不熟。單純提高每天題數,通常無法回答這個問題。
用四種模式診斷,而不是用一題決定能力
診斷不是模擬錄取,也不是心理測驗。選幾個與職缺相關、自己不熟悉答案的中小問題,分別觀察下面的能力。題目的難度與允許時間由你合理設定並保留紀錄,不套用未確認的公司標準。
| 診斷模式 | 先問的規則 | 出現這個症狀時,下一步 |
|---|---|---|
| 二分搜尋 | 區間是閉區間還是半開?什麼條件保留答案? | 邊界亂改:先手算空集合、單元素與不存在答案 |
| Hash map/計數 | 儲存的是位置、頻率還是集合成員? | 遇到重複就錯:重新定義每個 key 的語意 |
| Graph/遍歷 | 有方向嗎?何時標記 visited? | 重複處理或漏節點:畫最小環與不連通案例 |
| Window/雙指標 | 哪個單調性允許移動邊界? | 條件一改就失效:找會推翻單調性的反例 |
把結果分成四種:無法形成計畫、想法正確但實作不穩、程式正確但無法解釋、能完成且能處理追問。這些狀態需要不同練習,不宜全部標成「不會這種題」。
例如,你在 rotated array 二分搜尋中知道要找排序的一半,卻對重複元素的前提不清楚。下一步應先查該題契約,寫出哪些輸入保證讓判斷成立,再測不符合前提的變體。此時多做兩道很像的題,不如一次把條件說清楚。
又例如,你能寫 DFS,但只在單一路徑測試過。選含分支、環與不連通部分的圖做驗證,能區分 visited 時機與起始點覆蓋。這不是要求每個題單額外加一百題,而是把現有問題的測試深度補起來。
三種情況下如何選主題單
如果你已熟悉基本資料結構,希望在同一個 LeetCode 環境按核心安排練習,LeetCode 75 可以作為主要路線。使用官方推薦時間作為粗略參考,但以自己的重寫與測試紀錄調整進度。遇到先備知識缺口時,可以暫停一題,先補原理再返回。
如果你需要一個緊湊的核心檢查範圍,且願意自己安排復習,Blind 75 的原始精選用途比較符合這種需求。短不是「省略理解」,也不是代表每一題都會在目標公司出現。安排時最好保留 topic 與失敗原因,而不只勾題號。
如果你的每週時間差異大,或想限制難度與主題,Grind 75 的可調安排更容易表達這些限制。先設定真實時數,看看產生的範圍是否可行,再決定哪些已熟悉題能用快速重寫檢查。不要把工具估算當作自己必須達成的速度。
如果面試已非常接近,沒有必要在這三份題單中追求一次完整通關。先確認下一個面試的面向,保留已學模式的重寫與口頭練習,針對最明顯缺口補少量題。若下一輪是系統設計或專案討論,繼續加 DSA 完成數也不會代替那一輪的準備。
已經刷過一份,還需要換另一份嗎?
先問「完成」的意思。若你只記得解答架構,換題單可能讓熟悉題名製造新的成功感;若能在空白編輯器重寫、解釋不變量並測邊界,下一步才是查缺口、變體與職缺相關能力。
去重時保留一列問題身分,另外記錄各次嘗試。相同問題出現在兩份題單,可以沿用同一個歷史紀錄,而不是算成兩題新題。變體則另標「哪個條件改變」,不要把只改變敘事情境的同一算法當作全新能力。
錯題紀錄至少應包含原本假設、最小反例、修正規則與下一次不看提示的驗證。比如「window 題錯了」不夠;「以為每次移走左端都讓總和下降,但輸入允許負數」就能指向真正的演算法前提。
若你確實要擴大範圍,先加一個未覆蓋模式,而不是切換整份路線。面試準備的輸出應是可以被提問、改條件與驗證的能力,而不是三份清單的徽章集合。
兩個原創決策例子:同樣三週,不同主題單
假設候選人甲有十八小時可用,熟悉 arrays 與 hash map,但二分搜尋常在不存在答案時寫錯邊界。甲可以用上述時間帳,保留復習與模擬,把新題集中在搜尋與 graph 的明顯缺口。如果已在 LeetCode 75 練習,就不必為了「更完整」從另一份清單重頭開始。
甲的成功指標不是三週刷滿 75,而是在搜尋題留下不變量、空輸入、單元素與沒有答案的測試,並在一個改變條件的變體中重新判断。若甲仍會因一次失敗就更換整份題單,先建立兩次間隔重寫,能比新增熟悉題更清楚地驗證修正。
候選人乙每週時間不固定,已能獨立寫基本搜尋與遍歷,但還沒有完整的混合練習安排。乙可以用 Grind 75 的設定把實際時間表達出來,並保留 topic 與難度限制。工具生成的題目是規劃起點;遇到自己的實際解題時間與估算差距時,應調整範圍。
乙如果先選較窄的核心檢查,也可以以 Blind 75 做起點,但必須自己管理補題與復習。並沒有「忙的人只能選某一份」的規則;兩人的差異在於弱項與安排方式,而不是品牌的固定優劣。
假如兩人下一輪突然確認是專案與設計討論,時間帳就應加入那一類準備,而不是繼續把六小時新題當作不可更動的承諾。已完成的題目提供基礎,但不會自動產生一個能回答容量、失敗恢復與個人責任的專案故事。
何時停止新題,轉向復習與模擬?
不需要一個全體通用的題數門檻。比較最近幾次練習的失敗來源:如果大多是同一個已學過的邊界,新增同型題可能只是擴大錯誤紀錄;如果能穩定完成熟悉模式,卻從未接觸某個必要基礎,才應補新的模式。
模擬應使用自己不知道完整答案的問題,並保留補助方式。三十分鐘自己完成與三十分鐘邊看解答邊寫,是不同證據。時間只是你選擇的練習設定,不是某個公司未公開的通過標準。
練習夥伴可以改變一個條件,再觀察你的回答是否仍合理。例如 binary search 的資料不再保證元素互異,或 graph 多了 cycle。先解釋原演算法依賴哪個前提,再決定新增驗證、改演算法或縮小承諾。不要靠「面試通常不會這樣」避開題目。
如果只有表達跟不上,應練短解釋,而不是再刷十題。可以把同一題拆成契約、例子、不變量、複雜度與測試五個片段,錄下自己是否漏了主詞或條件。這是在讓既有能力可觀測,不是額外的題單競賽。
最後保留停止條件:下一輪範圍已確認、主要弱項有修正證據、模擬與回顧有時間,才決定是否加入下一題。當時間減少時,用停止條件縮小範圍;當條件變化時,重新計算,而不是為了完成徽章犧牲測試與休息。
題單以外的缺口,如何加入而不失去主線
在題單紀錄旁增加一個「下一輪需要、但本題單沒有提供的證據」欄位。例如,專案責任、設計容量、測試層級、英語解釋與工具規則。這不是要求你一次準備所有面向,而是避免把 DSA 完成數當作整場面試的準備比例。
若缺口是語言標準庫操作,就用一個小 probe 確認 API,再回到原題;不需要為了學會排序 comparator 增開另一份七十五題。若缺口是設計,則安排一個實際系統讨论,保存需求、方案與失敗行為,而不是把設計當成新演算法題。
補題也應有停止條件。你加入一个新 graph 問題,是為了驗證 visited 與 cycle 判斷;當不看提示就能說清前提、寫出程式並測反例,下一步可以轉向另一個缺口。沒有這個條件,補題很容易再變成無限增加的清單。
五題可以檢查你的選擇是否有效
這些題是相關能力練習,不宣稱它們同時存在於三份 75 題單。選其中符合弱項的題即可;表格不是另一個必須全部完成的新清單。
| 完整題目 | 用來診斷的問題 |
|---|---|
| Reason About Binary Search with One-Call-Delayed Feedback | API 回覆語意改變時,還能維持搜尋不變量嗎? |
| Search a Rotated Sorted Array in One Binary-Search Pass | 分支與邊界是否由契約推得? |
| Validate Adding an Edge to a Directed Acyclic Graph | 新邊如何改變可達性與循環判斷? |
| Validate a Binary Search Tree | 能否傳遞整個祖先範圍,而非只比較父子? |
| Return the Maximum of Every Sliding Window | 資料結構保存的是值還是索引,何時過期? |
練完後再看題單選擇:是安排不符時間,還是某個模式仍缺前提?前者需要縮小範圍,後者需要一次有深度的修正。只有這個回饋循環存在,路線才真的在服務你的面試。
可以從 旋轉陣列二分搜尋留下第一份診斷紀錄,再選 LeetCode 75、Blind 75 或 Grind 75 作為主要路線。保留復習與面試表達的時間,比繼續尋找一份能保證錄取的題單更可操作。