对二分的理解总是不够深刻,死循环,对题解的一些整理,自己看
1)
一个mid = (l+r)>>1
一个mid = (l+r+1)>>1
加不加1 完全取决于 l = mid 还是r = mid
l等于mid时必须+1向上取整 不然会陷入l=l的死循环
r = mid 时候不用加1 因为下一步l = r 直接会退出循环
2)
这两个模板解决的是 找>=||<=||>||< 某个数的
最左或最右的位置 但这个数不一定在二分的数组中
如果在就能准确找到
如果不在 找到的就是最接近答案的数(你要找大于等于5的第一个数)但
数组中没有5 那找到的就是6的位置(如果有6的话)
所以二分是一定有答案的
对于二分首先是确定你要找哪一个值一共有四种情况:
1.找小于x的第一个数的位置 (最左边x的左边第一个数)<x --> l = mid -- > mid = l + r + 1 >> 1
2.找大于等于x的第一个数的位置 (最左边的x) >= x --> r = mid -- > mid = l + r >> 1
3.找大于x的第一个数的位置 (最右边x的右边第一个数)>x --> r = mid -- > mid = l + r >> 1 ;
4.找小于等于x的最后一个数的位置(最右边的x) <= x --> l = mid -- > mid = l + r + 1 >> 1 ;
当l=mid的时候mid = l + r + 1>> 1 当 r = mid 的时候mid = l + r >> 1 ;
不懂的看下面acwing的图理解一下