【二分模板】

二分模板

二分本质:寻找问题的边界 在[L, R]区间定义某种性质,可以将区间分为两个部分,左边是不满足该性质,右边满足该性质

【二分模板】_第1张图片

//寻找绿色边界点
//区间分为[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位于红色边界点上

你可能感兴趣的:(算法)