前言
在做LIS的O(nlgn)算法时,用到了二分查找算法。对于其中的一些条件,例如 l<r 和 l <= r 的区别,r = mid和r = mid-1的区别等等不是很了解,于是进行了一些学习。
找第一次的出现位置
二分查找因为有几个限制,其中一个便是 单调序列 这个要求,所以可能出现 2 3 4 4 4 5 6这样的数组,那么返回第一个出现的位置便是 i = 3时。
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|
a[i] | 2 | 3 | 4 | 4 | 4 | 5 | 6 |
- 具体思路 :对于 l = 0,r = 6的区间,每次求mid = l+(r-l)/2 (这里是因为怕溢出,如果是l+r,可能溢出你设置的类型,比如溢出int),判断a[mid]与所查找的数x的大小关系,如果 a[mid] < x,那么l = mid+1。否则 r = mid。这里因为 /2 都是向下取整,所以r = mid ,r右移。
例如 寻找 4 第一次出现的位置,最后 r = 2,mid = 1,a[mid] < x,l右移,则确定 第一个4. - 代码 :