二分模板
二分本质:寻找问题的边界 在[L, R]区间定义某种性质,可以将区间分为两个部分,左边是不满足该性质,右边满足该性质
//寻找绿色边界点
//区间分为[l, mid] 和 [mid + 1, r]
int l = 0, r = n - 1;
while (l < r) {
int mid = (l + r) >> 1; // 由于mid在左边边区间所以不用+1
if (check(mid)) {//为true代表mid在绿色区间
r = mid; //缩小区间到[l, mid]
} else l = mid + 1; //为false 代表mid在红色区间,缩小区间到[mid+1, r]
}
//循环结束后 r位于红色边界点上
//寻找红色边界点
//区间分为[l, mid - 1] 和 [mid, r]
int l = 0, r = n - 1;
while (l < r) { /
int mid = (l + r + 1) >> 1; // 由于mid在右边区间所以要+1
if (check(mid)) {//为true代表mid在红色区间
l = mid; //缩小区间到[mid, r]
} else r = mid - 1; //为false 代表mid在绿色区间,缩小区间到[l, mid-1]
}
//循环结束后 r位于红色边界点上