二分查找数列是必须要按顺序排列的,需要2个指针指向尾和头,可能有时候会与枚举连在一起使用,大大降低时间复杂度。
二分查找基础代码
#include <stdio.h>
int main()
{ int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int L=0,R=n-1;
int mid=L+(R-L)/2;
int goal;
scanf("%d",&goal);
while(1)
{
if(L>R)
{
printf("None\n");
break;
}
if(a[mid]>goal)
{R=mid-1;
mid=L+(R-L)/2;
}
if(a[mid]<goal)
{
L=mid+1;
mid=L+(R-L)/2;
}
if(a[mid]==goal)
{ printf("%d",mid+1);
break;
}
}
}
与枚举一起使用时,如下。
N个隔间,C头牛,各个隔间坐标为x0.....xN-1,(0<=xi<=100000000),此时求任意2牛之间的最大的最小距离。
那么,此时设最大的最小距离为D,那么首先任意2牛距离>=D.同时1<=D<=10000000/c;
这时候,我们就要利用二分查找思想减少枚举数量,先令D=1000000000/2c,L=0,R=10000000/c;
计算当距离都>=D时,是否能全部放下牛,如果可以,则往D大的方向想,令L=D+1,D=L+R/2;
若不能,则R=D-1,往这个方向枚举直至max。