二分查找一(基础)

二分查找一:找任意数的下标。

思路: 今天我们来讲讲最基础的二分查找,在讲之前,先跟大家玩个小游戏,在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;
}

感谢大家支持!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值