版本1
这种适用于答案落在左半区间,一般适用于求解最小化最大值
当区间[l, r]的更新操作是r = mid; l = mid + 1;时,计算mid时不需要加1。
C++ 代码模板:
int bsearch_1(int l, int r) { while (l < r) //l=r结束 { int mid = l + r >> 1; if (check(mid)) r = mid; else l = mid + 1; } return l; }
版本2
这种适用于答案落在右半区间,一般适用于求解最大化最小值
当区间[l, r]的更新操作是r = mid - 1; l = mid;时,计算mid时需要加1。
C++ 代码模板:
int bsearch_2(int l, int r) { while (l < r)//l=r结束 { int mid = l + r + 1 >> 1; if (check(mid)) l = mid; else r = mid - 1; } return l; }