0
点赞
收藏
分享

微信扫一扫

二分解题套路

技术只适用于干活 2022-01-05 阅读 44
算法c++

整数二分模板

bool check(int x) {/* ... */} //检查x是否满足某种性质
 
// 区间[left, right]被划分成[left, mid]和[mid + 1, right]时使用:
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;
}
// 区间[left, right]被划分成[left, mid - 1]和[mid, right]时使用:
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;
}

思路

1.二分的本质不是单调性

2.二分的主要思想是折半

3.过程

浮点数二分模板

bool check(double x) {/* ... */} // 检查x是否满足某种性质
 
double bsearch_3(double l, double r)
{
    const double eps = 1e-6;  // eps 表示精度,取决于题目对精度的要求
    while (r - l > eps)//如果让你保留四位小数,则eps写成1e-6;如果是保留五位小数,则eps写成1e-7
    {
        double mid = (l + r) / 2;
        if (check(mid)) r = mid;
        else l = mid;//不需要处理边界了
    }
    return l;
}

思路

1.浮点数二分的本质也是边界
2.浮点数二分因为没有整除,每次都可以严格的缩小一半,所以不需要处理边界,相对简单
3.过程

举报

相关推荐

0 条评论