理解
1、check(int x) 检查x是否满足某种性质
2、模板1为:满足条件向左逼近,不满足条件向右逼近。如果有多个满足条件的数据,返回最左边那个。
3、模板2为:满足条件向右逼近,不满足条件向左逼近。如果有多个满足条件的数据,返回最右边那个。
4、yxc大佬的模板,适用于二分查找和二分答案。
bool check(int x) {/* ... */} // 检查x是否满足某种性质 // 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用: int bsearch_1(int l, int r) { while (l < r) { int mid = l + r >> 1; if (check(mid)) r = mid; // check()判断mid是否满足性质 else l = mid + 1; } return l; } // 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用: int bsearch_2(int l, int r) { while (l < r) { int mid = l + r + 1 >> 1; if (check(mid)) l = mid; else r = mid - 1; } return l; }