二分的前提是已排好序。
二分就是分为两段区间,区间之间的分界点需要在循环中不断更新,所以需要一个中间点mid标记更新区间的。
浮点数二分
while(r - l >= 1e-8)//精度要看要求 浮点数末尾有.1
{
double mid = (l + r) / 2;
if(check…) r = mid;
else l = mid;
}
这里就简单记住,直接等于mid就好了。
整数二分
int l = 0,r = n - 1;
while(l < r)
{
int mid = l + r >> 1;
if(check…) r = mid;
else l = mid + 1;
}
int l = 0,r = n - 1;
while(l < r)
{
int mid = l + r + 1 >> 1;//要很注意,否则会进入死循环
if(check…) l = mid;
else r = mid - 1;
}
- 因为是int型,当l、r差值为1时,l为3,r为4,则mid为l即3,则会进入死循环,所以要分别对前一部分和后一部分进行判断,且在对后一部判断更新的时候要对;
- 由于整形,所以在更新l、r的时候需要注意区间的开和闭(死记=.=)。