Binary Search 的概念每個人都懂——在排序好的陣列裡,每次比較中間的元素,再根據大小丟掉左半或右半,重複直到找到目標。但實際寫出來時,off-by-one error 讓很多人翻車。這篇先把基礎打穩,再看 Rotated Sorted Array 這個變形題。
為什麼是 O(log n)?
每一步都把搜尋範圍砍半。從 n 個元素開始,最多幾步才到 1 個?
1024 個元素最多只需要 10 步(log₂ 1024 = 10)。如果是 10 億個元素,也只需要 30 步。這就是 O(log n) 的威力。
#704 基本解法
mid = (right - left) // 2 + left 為什麼不直接寫 (left + right) // 2?
這是你程式碼裡的一個細節,值得單獨說明。
Python 的整數沒有 overflow,所以兩種寫法結果一樣。但這是面試的標準寫法,Java/C++ 面試時寫錯會被扣分。
Off-by-one:最常見的 Binary Search Bug
Binary Search 有兩種終止條件,容易搞混:
while left <= right
搜尋範圍包含 left == right 的情況(只剩一個元素還要檢查)。找「精確值」用這個。
left=4, right=3 → 停止
while left < right
搜尋範圍不包含 left == right。找「邊界」(第一個 ≥ target 的位置)用這個。
回傳 left 作為答案
變形題:#33 Search in Rotated Sorted Array
如果陣列被「旋轉」過呢?
直接用 Binary Search 行不行?不行——旋轉後整個陣列已經不是單調遞增了,mid 的大小無法直接告訴你目標在左還是右。
關鍵觀察:旋轉後,陣列的左半和右半,其中一邊一定是有序的。 利用這個性質,先判斷哪一半有序,再決定要往哪邊走。
思維步驟
Binary Search 的所有變形題,核心都是同一件事:在每一步,確保你能丟掉「目標一定不在那裡」的那一半。條件怎麼寫,取決於你能做出什麼保證。
本篇重點整理