在使用二分查找时我们计算mid时通常会有两种写法:
第一种:
while(l<r){
int mid = (l+r)>>1;
...
}
对于这样的写法常常存在mid超界问题,也就是l
和r
可能接近int
的最大值了,导致l+r
超出int
的最大值,出现逻辑错误。
因此我们常常使用第二种写法,即位运算的写法:
while(l<r){
int mid = (r-l)>>1+l;
...
如果不注意,我们很可能就会这么写,但是这种写法一般会出现死循环的问题,为什么呢?因为>>的优先级低于+,这就会导致在计算mid时是先计算1+l,然后计算>>,也就是实际上的运算是这样的(r-l)>>(l+1)
,很显然这不是我们想要的计算,因此正确的写法为:
while(l<r){
int mid = l+((r-l)>>1);
也就是必须在(r-l)>>1
外围再加上一个括号才是正确的写法。
这虽然只是一个小问题,但实际使用中,往往是细枝末节导致程序出现bug。养成良好习惯,才能让程序按照我们想的运行。