1、分段有序查找目標值:
「分段數組查找目標值」問題,都可以通過將數組分段,從而轉化成我們熟悉的「有序數組查找目標值」問題!
思路來源:力扣題:1095. 山脈數組中查找目標值。
根據峯頂將山脈數組分爲「升序數組」和「降序數組」兩段,分別進行二分查找。
2、中點mid更新方式:
int mid = (left + right) / 2;
這種寫法在絕大多數情況下沒問題,但是在 left 和 right 特別大的場景中,left + right 會發生整形溢出,得到一個負數,mid 的值隨之也是負數。改進的寫法是:
int mid = left + (right - left) / 2;
3、邊界條件更新:防止死循環
當left
和right
差值爲 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;
。