首页 有序数组中大于等于指定值得首个数的位置
文章
取消

有序数组中大于等于指定值得首个数的位置

问题

请实现有重复数字的有序升序数组的二分查找。

输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度+1。位置从1开始。

如:

输入 4,[1,2,4,4,5]
输出 3
输入 6,[1,2,4,4,5]
输出 6

解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def upper_bound(value: int, data: list) -> int:
    if not data:
        return 1
    if a[-1] < value:
        # 数组都小于value
        return len(data) + 1

    left, right = 0, len(data)
    result = 0
    while left < right:
        mid = (left + right) >> 1
        if value > data[mid]:
            # 往大缩小范围
            left = mid + 1
        else:
            # 已经找到了比 value大的已知最小值,更新result,往小缩小范围继续查找
            result = mid
            right = mid
    return result + 1  # 索引从1开始,最后加1
本文由作者按照 CC BY 4.0 进行授权