C++二分查找的手动实现:
int lower_bound(int a[],int L,int R,int val) //二分寻找大于等于val第一个数的下标
{
int mid;
while(L<=R)
{
mid=(L+R)/2;
if(a[mid]<val)
{
L=mid+1;
}
else
{
R=mid-1;
}
}
return L;
}
int upper_bound(int a[],int L,int R,int val) //二分寻找大于val的第一个数的下标
{
int mid;
while(L<=R)
{
mid=(L+R)/2;
if(a[mid]<=val)
{
L=mid+1;
}
else
{
R=mid-1;
}
}
return L;
}
二分答案的一般模板(最大值最小化,最小值最大化)
//(l和r分别为初始时区间的下界和上界)
//①当二分区间为[l,mid] [mid+1,r]时:
//最大值最小化
while(l<r)
{
int mid=(l+r)>>1;
if(check(mid))
{
r=mid;
}
else
{
l=mid+1;
}
}
//②当二分区间为[l,mid-1] [mid,r]时:
//最小值最大化
while(l<r)
{
int mid=(l+r+1)>>1;
if(check(mid))
{
l=mid;
}
else
{
r=mid-1;
}
}
//最终l为二分结果
//上面两个模板分别对应两种题型:最大值最小化问题和最小值最大化问题
在求数的三次方根的时候,边界一定要确保大与1,否则如果求-0.001的三次方根时会死循环,也要保证考虑了负数的情况,可以直接用题目中的范围来作为二分的边界,不考虑输入的数是多少。[例如这个题](https://www.acwing.com/problem/content/792/)