二分查詢是刷題者必知必會的一個演算法,寫法有很多種,對於初學者來說,如果沒有記住一種固定寫法,很容易不同寫法混淆,造成錯誤。
這是我寫二分查詢演算法題時固定的模板:
// 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
,這樣當lo
和hi
相鄰時,二分查詢就會退出迴圈,避免lo
大於hi
的情況發生。跳出迴圈後,我們還需根據題目要求比較lo
和hi
索引下的陣列值和目標值是否相符,返回題目要求的結果。 - 我覺得這個模板最大的好處就在於能給初學者一個比較清晰的思路,不會因
lo
和hi
的索引混亂產生思路的混亂,造成死迴圈的產生。 - 後續博文涉及的二分查詢演算法題我都將用此模板進行解答。
- 參考:YouTube - basketwang
本作品採用《CC 協議》,轉載必須註明作者和本文連結