二分查找模版

发布时间 2023-10-30 11:17:43作者: 梦醒时风

给定一个有序数组nums,求数组中第一个>=目标值target的下标位置和最后一个>=目标值target的下标位置。
这是一道基础的二分查找问题,关于二分的写法有很多种,难点在于对于二分边界的处理,代码编写的过程中很容易容易出现死循环问题,因此建议套用现成的一些二分模版,关于二分模版网上有很多种。
下面的代码模版来自yxc大佬的代码模版,原文链接:https://www.acwing.com/blog/content/277/

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;
}