1、q[mid]>=x时,需要往左寻找,r指针会一直往左移动,等于x的时候也会往左移动,一直移动到q[mid]<x的地方,那么此时找到的那个数就是x的最左端;
同理q[mid]<=x时,需要往右寻找,l指针会一直往右移动,等于x的时候也会往右移动,一直移动到q[mid]>x的地方,那么此时找到的那个数就是x的最右端;
2、mid=l+r与mid=l+r+1的问题
通过(l + r) / 2 计算mid的值,结果是向下取整的。在区间内只有两个元素的时,r的值可以用l + 1代替,因此mid = (l + r) / 2 = (l + l + 1) / 2 = l。这个时候更新l = mid,l的值更新后依旧为l。 下次处理的区间和这次相同,陷入了死循环
如果程序中出现了l=mid,因为整数除法结果是向下取整,所以l更新后的值可能等于更新前值,因此陷入死循环。
只要程序中有l = mid这种情况,mid就用mid = (l + r + 1) / 2计算即可。
结论:
程序中不要同时出现l = mid, r = mdi这两条语句。
如过程序中出现了l = mid,mid的值用 (l + r + 1) / 2计算。
如果程序中出现了r = mid,mid的值用((l + r) / 2计算。
]