在有序数组中二分查找目标值,并支持查找插入位置(lower_bound)。
思想:每次取中点,比较后丢弃一半区间,直到命中或区间为空。
function binarySearch(nums, target) {
let lo = 0, hi = nums.length - 1
while (lo <= hi) {
const mid = (lo + hi) >> 1
if (nums[mid] === target) return mid
else if (nums[mid] < target) lo = mid + 1
else hi = mid - 1
}
return -1
}
// 查找第一个 ≥ target 的位置(插入位置)
function lowerBound(nums, target) {
let lo = 0, hi = nums.length
while (lo < hi) {
const mid = (lo + hi) >> 1
if (nums[mid] < target) lo = mid + 1
else hi = mid
}
return lo
}- 时间
O(log n),空间O(1) - 边界易错:
lo/hi更新与循环条件要配套(闭区间用<=;左闭右开用<)