直接回答
二分查找在有序数组中每次取中间元素与目标比较,将搜索范围缩小一半,时间复杂度 O(log n)。适用条件:数据有序(或具有单调性/可二分判定性)、支持随机访问。实现要点是处理好边界:循环条件、中点计算防溢出、区间收缩方式三者必须自洽。
展开解析
最常用写法是闭区间 [lo, hi]:循环条件 lo <= hi,mid = lo + (hi - lo) / 2 避免整数溢出(Java/C++ 中 lo+hi 可能越界),命中返回,否则 lo = mid + 1 或 hi = mid - 1。易错点:死循环往往因为收缩时写成 hi = mid 而循环条件又是 <=;半开区间 [lo, hi) 写法循环条件和收缩方式都要对应改。变种要分清:查找第一个 ≥ target(lower_bound)、最后一个 ≤ target、旋转有序数组查找等,各自边界不同。追问方向:答案单调的最优化问题可二分答案(如最小化最大值类题目)、浮点二分用迭代次数而非差值控制精度。
示例
def bsearch(a, t):
lo, hi = 0, len(a) - 1
while lo <= hi:
mid = lo + (hi - lo) // 2
if a[mid] == t: return mid
if a[mid] < t: lo = mid + 1
else: hi = mid - 1
return -1