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