版本1
当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1。
C++ 代码模板:
1 int bsearch_1(int l, int r)
2 {
3 while (l < r)
4 {
5 int mid = l + r >> 1;
6 if (check(mid)) r = mid;
7 else l = mid + 1;
8 }
9 return l;
10 }
版本2
当我们将区间[l, r]划分成[l, mid - 1]和[mid, r]时,其更新操作是r = mid - 1或者l = mid;,此时为了防止死循环,计算mid时需要加1。
C++ 代码模板:
1 int bsearch_2(int l, int r)
2 {
3 while (l < r)
4 {
5 int mid = l + r + 1 >> 1;
6 if (check(mid)) l = mid;
7 else r = mid - 1;
8 }
9 return l;
10 }
作者:yxc
链接:https://www.acwing.com/blog/content/31/
来源:AcWing
来源:https://www.cnblogs.com/sxq-study/p/12021084.html