应用:在一个具有某种单调性质的数组中,进行快速查找。
思路:双指针;从左和右 ,向目标值一次一次逼近的过程。
整数二分:
void search(int *a,int l,int r,int target)
{
while(l<r)
{
int mid=l+r+1>>1;
if(a[mid]>=target) r=mid;//找到第一个大于等于target的值
else l=mid+1;
}
return l;
}
void serach(int *a,int l,int r,int target)
{
while(l<r)
{
int mid=l+r>>1;
if(a[mid]<=target) l=mid;//找到第一个小于等于target的值
else r=mid-1;
}
return l;
}
浮点数二分:(没有边界问题 )(常使用在求根)
void search(double l,double r,double target)
{
int eps=?;//eps表示精度 一般来说 比题目要求多两位小数
while(r-l>eps)
{
double mid=(l+r)/2;//不能用位运算
if(mid>=target) r=mid;
else l=mid;//无边界问题
}
return l;
}