-
二分查找(查找特定值)
- 定义查找区间的左右端点$l$和$r$,查找区间$[l,r]$.
- 当$l\leq r$时,计算中间值$mid=(l+r)/2=l+(r-l)/2$.
- 若$mid=k$,则找到答案
- 若$mid>k$,则设$r=mid-1$,继续搜索
- 若$mid<k$,则设$l=mid+1$,继续搜索
- 当$l>r$时,原区间$[l.r]$内不存在$k$。
- 模板代码:
while (l <= r) { int mid = (l + r) / 2; if (a[mid] == b) { // 找到此数 break; } if (a[mid] > b) r = mid - 1; else l = mid + 1; }
-
二分查找(查找第一个满足条件的位置)
- 初始赋值:$l$是一个不满足条件的位置,$r$是一个满足条件的位置。
- 当$l+1<r$,即$l$和$r$不相邻时,计算中间端点$mid=(l+r)/2=l+(r-l)/2$.
- 若$mid$满足条件,设$r=mid$,继续搜索
- 若$mid$不满足条件,设$l=mid$,继续搜索
- 当$l+1=r$时,$r$为第一个满足条件的位置。
- 模板代码
while (l + 1 < r) { int mid = (l + r) / 2; if (a[mid] >= k) r = mid; else l = mid; }
-
二分答案
- 使用二分查找的思路,通过对if的条件加以修改,得到答案,即为二分查找。