标准二分查找右边界模板

二分查找作为程序员的一项基本技能,是面试官最常使用来考察程序员基本素质的算法之一,也是解决很多查找类题目的常用方法,它可以达到 O(logN) 的时间复杂度。有了寻找左边界的分析之后,再来看寻找右边界就容易很多了,毕竟左右两种情况是对称的嘛。

二分寻找左边界模板可以参考https://blog.csdn.net/justidle/article/details/104304725这篇文章。

前提条件

必须有序。一般是从小到大有序。

坑点

计算中间值导致的数据越界。一般我们都是定义左边界(left)和右边界(right)都使用 int 类型,如果 left 和 right 足够大,mid = (left + right)/2,可能会由于 left+right 导致 int 数据类型越界。所以安全的写法是 mid = left + ((right - left) >> 1) 或者 mid = left + (right - left) / 2,推荐使用右移操作,因为右移比除法快。

模板代码

实现类似 STL 中的 upper_bound 函数功能。

C++模板

int upper_bound(int *A, int l, int r, int val){ // [l, r)
    while (l<=r) {
        int mid = l + ((r-l)>>1);
        if(A[mid] <= val) {
            l = mid+1;
        } else {
            r = mid-1;
	}
    }

    return l;
}

你可能感兴趣的:(OI,#,查找,二分查找右边界模板,二分,右边界,模板)