二分查找,查找第一个>=x的数的右边界,其中数组元素升序。

二分查找的一个问题

对一个元素升序排列的数组,查找其中第一个 >= x 的元素的右边界。

这是我写的代码,但其中 a[mid] > x 时候不知道怎么写代码


```c

int find(int x, int l, int r) // 查找升序数组中第一个 >= x 的元素的右边界
{
    while (l < r)
    {
        int mid = (l + r + 1) / 2;
        if (a[mid] == x)
            l = mid;
        else if (a[mid] > x)
            // 这个地方怎么写?
        else
            l = mid + 1;
    }
    if (a[l] == x)
        return l;
    return -1;
}

```

望采纳

  • 当 a[mid] > x 时,可以将搜索范围缩小到左半边,即 r = mid - 1。
int find(int x, int l, int r) // 查找升序数组中第一个 >= x 的元素的右边界
{
    while (l < r)
    {
        int mid = (l + r + 1) / 2;
        if (a[mid] == x)
            l = mid;
        else if (a[mid] > x)
            r = mid - 1;
        else
            l = mid + 1;
    }
    if (a[l] == x)
        return l;
    return -1;
}

当 a[mid] >=x时,你再比较一下a[mid-1]是否<x即可。如果小于x,那么mid就是边界。当然,比较前先判断mid不等于0