一、查找某个数
代码:
int erfen(int k)//假设数组是递增数组,精确查找是否存在k,下标在(0<=i<n)范围里
{
int left=0,right=n;
while(left<right)
{
int mid=(left+right)/2;
if(a[mid]<k)
{
left=mid+1;
}
else if(a[mid]>k)
{
right=mid;
}
else
{
return mid;
}
}
return -1;
}
当下标在1<=i<=n中,中间需要单独判断
int erfen(int k)//假设数组是递增数组,精确查找是否存在k
{
int left=1,right=n;
while(left<right)
{
int mid=(left+right)/2;
if(a[mid]<k)
{
left=mid+1;
}
else if(a[mid]>k)
{
right=mid;
}
else
{
return mid;
}
}
if(left==right)
if(a[left]==k)
return left;
return -1;
}
二、找下界(这个地方是找下界的前一个元素的下标)(0<=i<n)
int erfen(int k)//找小于k的前一个数
{
if(a[0]>=k)
return -1;
//当第一个元素大于k时,无下界
//当第一个元素等于k时,无下界,但是第一个数等于k,需要单独判断
int left=0,right=n-1;
while(left<right)
{
int mid=(left+right+1)/2;//left肯定不会超过right,所以需要+1,防止无限循环
if(a[mid]<k)//因为找小于k的数,所以等于k就相当于大了
{
left=mid;
}
else
{
right=mid-1;//只能改right
}
}
return (left+1);//如果满足前两个条件的话,一定会找到第一个比k小的数
//因为下标从0开始,所以返回后一个元素
}
三、找上界(找小于k的前一个元素)(0<=i<n)
int erfen(int k)//找大于于k的后一个数的下标
{
if(a[n-1]<=k)
return -1;
//当最后一个元素大于k时,无上界
//当最后一个元素等于k时,无上界,但最后一个数等于k,需要单独判
int left=0,right=n-1;
while(left<right)
{
int mid=(left+right)/2;
if(a[mid]>k)//因为找大于k的数,所以等于k就相当于小了
{
right=mid;
}
else
{
left=mid+1;//这里只能改left
}
}
return (right+1);//如果满足前两个条件的话,一定会找到第一个比k大的数
}
四、二分还可以用来求切割c块的最大值最小是多少的问题
链接:https://blog.csdn.net/qq_45712954/article/details/108852781