二分与单调性:具备单调性一定可以二分,但可以二分的题目不一定就具备单调性。
如何区分计算mid时是否需要加1:
先写出check函数,根据check函数后续l与r的范围,来确定是否需要加1;
如果是l = mid,则需要加1;
如果是r = mid,则不需要加1。
为什么需要加上1?因为除法默认下取整,对于第一种情况,当l与r只相差1个距离,即l = r - 1,r = l + 1,假设不补上加1,即mid = floor((l + r) / 2) = floor((l + l + 1)/2) = l,而我们又让l = mid;二分查找范围没有发生任何变化,最终导致死循环。
1 int BinarySearch(int l,int r) 2 { 3 while(l < r) 4 { 5 int mid = l + r >> 1; 6 if(check(mid)) 7 r = mid; 8 else 9 l = mid + 1; 10 } 11 } 12 13 int BinarySearch(int l,int r) 14 { 15 while(l < r) 16 { 17 int mid = l + r + 1 >> 1; 18 if(check(mid)) 19 l = mid; 20 else 21 r = mid - 1; 22 } 23 }