零、二分查詢框架
func binarySearch(nums []int, target int)int { left := 0, right := ... for ... { mid := left + (right - left) / 2; if (nums[mid] == target) { ... } else if nums[mid] < target { left = ... } else if nums[mid] > target { right = ... } } return ... }
分析二分查詢的一個技巧是:不要出現 else,而是把所有情況用 else if 寫清楚,這樣可以清楚地展現所有細節。本文都會使用 else if,旨在講清楚,讀者理解後可自行簡化。
其中 ...
標記的部分,就是可能出現細節問題的地方,當你見到一個二分查詢的程式碼時,首先注意這幾個地方。後文用例項分析這些地方能有什麼樣的變化。
另外宣告一下,計算 mid 時需要防止溢位,程式碼中 left + (right - left) / 2
就和 (left + right) / 2
的結果相同,但是有效防止了 left
和 right
太大直接相加導致溢位。