二分查詢 | 二分查詢的一種推薦寫法

Borris發表於2020-02-06

二分查詢是刷題者必知必會的一個演算法,寫法有很多種,對於初學者來說,如果沒有記住一種固定寫法,很容易不同寫法混淆,造成錯誤。

這是我寫二分查詢演算法題時固定的模板:

// int[] nums[] -- array
// int target -- the num we want to find
// return the index of target if found
int len = nums.length;
int lo = 0;
int hi = len - 1;
while (lo + 1 < hi) { // *key
    int mid = (hi - lo) / 2 + lo; // Avoiding overflow
    if (nums[mid] == target) {
        return true;
    } else if (nums[mid] <target) {
        lo = mid;
    } else {
        hi = mid;
    }
}

if (nums[hi] == target || nums[lo] == target) {
    return true;
}

return false;
  • 如果你對二分查詢不太熟悉,可以查閱資料自行了解,本文不再贅述。
  • 這個寫法的關鍵在於將 while-loop 的條件設定為 lo + 1 < hi,這樣當 lohi 相鄰時,二分查詢就會退出迴圈,避免 lo 大於 hi 的情況發生。跳出迴圈後,我們還需根據題目要求比較 lohi 索引下的陣列值和目標值是否相符,返回題目要求的結果。
  • 我覺得這個模板最大的好處就在於能給初學者一個比較清晰的思路,不會因 lohi 的索引混亂產生思路的混亂,造成死迴圈的產生。
  • 後續博文涉及的二分查詢演算法題我都將用此模板進行解答。
  • 參考:YouTube - basketwang
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章