二分查找一:找任意数的下标。
思路: 今天我们来讲讲最基础的二分查找,在讲之前,先跟大家玩个小游戏,在1到1000中任意想一个数,我猜10次,你只告诉我数是大了还是小了,我就能猜出来。其实原理很简单,2的十次方=1024>1000,所以只要我每次猜2的次方,就能保证最坏也能排除一半答案。二分也是如此,就是将一串递增子序列(如果不是的话就排个序)不断从中间切一刀,进行判断,舍弃一半,不断重复,这个过程一直持续一段时间。直到确认答案为止。好理论讲完了,在程序中我们需要定义两个量(如l,r),分别表示区间的左边和右边,再定义一个中间值(如mid)=(l+r)/2在将其进行进行二分,判断mid是否小于要找的值,是的话,就将l定义为mid+1(这里为左结合,具体下一篇文章会讲);否则就将l定义为mid,不断增大l的值,并且不断减小r的值,慢慢缩小搜索范围,最终就可以得出答案啦。注意:这里注意一下,最后要判断一下,有可能根本就没有要找的数
代码:
//制作不易,麻烦点给赞。
#include<bits/stdc++.h>
using namespace std;
int a[2000002];
int n,m;
int main ()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=0;i<=n-1;i++)
cin>>a[i];
for(int i=1;i<=m;i++)//一共查找m次。
{
int x;
cin>>x;
int l=0,r=n-1;
while(l<r)
{
int mid=(l+r)>>1;
if(a[mid]<x)//判断是否小于要找的数
l=mid+1;//区间左的变化
else
r=mid;//区间右的变化
}
if(a[l]==x)//判断是否符合要找的数
cout<<l<<endl;
else
cout<<"-1"<<endl;//没有就输出“-1”。
}
return 0;
}
感谢大家支持!!!