二分法:即能够找到一个条件check使得数组分为两个部分
寻找右边界的二分查找模板:
int right_bound(int l, int r) {
while (l < r) {
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
寻找左边界的二分查找模板:
int left_bound(int l, int r) {
while (l < r) {
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
1需注意的是当数值过大 需使用long long 防止溢出
2满足单调性的数组一定可以使用二分查找,但可以使用二分查找的数组不一定需要满足 单调性
3注意边界处理