二分查找写法千千万,错的多半在边界。记住一个不会错的模板:
def bs(a, x):
lo, hi = 0, len(a) - 1
while lo <= hi:
mid = (lo + hi) // 2
if a[mid] == x: return mid
if a[mid] < x: lo = mid + 1
else: hi = mid - 1
return -1
翻车点:
1. hi 初始化成 len(a) 还是 len(a)-1,必须和循环条件配套。
2. mid 溢出:Python 不会,但 C/Java 要用 lo + (hi-lo)//2。
3. 找「第一个/最后一个 ≥ x」时,lo/hi 的更新和返回值要重推。
模板化的好处是:不管找等于、找左界、找右界,只改两三行,不会乱。
楼主 · 2026-09-27 05:18 · 浏览 214
· 编辑于 2026-09-27 05:18

