二分查找——红蓝染色法
二分查找的核心不是"猜中目标",而是将数组染成红蓝两色,答案就是红蓝交界处。
基本问题
查找有序数组中第一个 >= target 的位置。若全部 < target,返回数组长度。
算法核心——染色逻辑
设定红蓝两种颜色:
| 颜色 | 含义 | 区间 |
|---|---|---|
| 红色(false) | < target | [0, L-1] |
| 蓝色(true) | >= target | [R+1, n-1] |
循环不变量:每次迭代后,[0, L-1] 一定为红色,[R+1, n-1] 一定为蓝色。
| |
关键规则:
M染色为红色时:L = M + 1(排除[0, M])M染色为蓝色时:R = M - 1(排除[M, n-1])
L = M + 1 而非 L = M——当区间只剩一个元素时,L = M 会进入死循环。
Go 实现
| |
变体
| 变体 | 染色条件 | 返回值 |
|---|---|---|
第一个 >= target | < target 染红 | left |
第一个 > target | <= target 染红 | left |
最后一个 < target | < target 染红 | right |
最后一个 <= target | <= target 染红 | right |
用"染什么色"统一理解四种变体,不再背 left/right/mid±1。
循环不变量是二分查找的证明
循环不变量在循环的每一轮前后都成立:
| |
循环不变量成立 + 区间每次严格缩小 → 算法收敛到正确答案。不需要特殊处理边界——循环不变量保证了边界正确性。