二分法的使用技巧、注意點

1、分段有序查找目標值:
「分段數組查找目標值」問題,都可以通過將數組分段,從而轉化成我們熟悉的「有序數組查找目標值」問題!

思路來源:力扣題:1095. 山脈數組中查找目標值
根據峯頂將山脈數組分爲「升序數組」和「降序數組」兩段,分別進行二分查找。

2、中點mid更新方式:

int mid = (left + right) / 2;

這種寫法在絕大多數情況下沒問題,但是在 left 和 right 特別大的場景中,left + right 會發生整形溢出,得到一個負數,mid 的值隨之也是負數。改進的寫法是:

int mid = left + (right - left) / 2;

3、邊界條件更新:防止死循環
leftright差值爲 1 或 0 時,如果在 if else 語句裏面出現 left = mid,會出現死循環。因爲mid永遠等於left

if (check(mid)) {
    // 下一輪搜索區間是 [mid + 1, right]
    left = mid;
} else {
    right = mid-1;
}

應該修改爲向上取整:

int mid = left + (right - left + 1) / 2;
if (check(mid)) {
	left = mid;
} else {
    right = mid - 1;
}

參考資料:二分法詳細介紹

總結:

1、二分查找算法時間複雜度爲O(lgn);
2、如果在 if else 語句裏面出現 left = mid,mid應該修改爲向上取整int mid = left + (right - left + 1) / 2;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章