P2249 【深基13.例1】查找

# [洛谷  P2249    【深基13.例1】查找](https://www.luogu.com.cn/problem/P2249)

## 看看~~臭老鼠~~我的评测记录吧
https://cdn.luogu.com.cn/upload/image_hosting/dnzricex.png
看在~~臭老鼠~~我这么辛苦写代码的份上,点个赞吧。


# 看题
https://cdn.luogu.com.cn/upload/image_hosting/prdp96h2.png

## 直接从头到尾搜索一遍查找数字是不可行的。
为什么?
就因为我试过,0蛋...
### 那么时间复杂度必为o(mn),
我想你应该不喜欢吧


那么这个时候,我们帅气的二分查找闪亮登场!!!(撒花)

### 我们先考虑从中间的数字开始查找:
# •那么如果中间的数字等于我们要找的数字,那么直接直接输出在返回便是
# •如果中间的数字小于我们要找的数字,那么再从中间数~n查找
# •如果中间数大于我们要找的数的话,同理,从1或0(看你自己)~ 中间数查找


二分过程中,如果 mid 位置的值大于等于 我们要找的数,就将 r 移动到
mid,否则就将 l 移动到 mid+1。(mid为中间值,l为左端点,r为右端点)
这样 r 永远是大于等于q的位置,而 l − 1 永远是小于 𝑟 的位置。
提示:二分中,在数组a[1]~a[n]中通常是有序的

最后奉上代码不堪入目
```
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[10000005];
int find(int x) {
    int l = 1, r = n + 1;
    while (l < r) {
        long long mid = l + (r - l)/2; 
        if (a[mid] >= x)r = mid;
        else l = mid + 1;
    }
    if(a[l] == x)return l;
    else return -1; 
}
int main(){
    
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=m;i++){
        int o;
        cin>>o;
        int ans=find(o);
        cout<<ans<<" ";
    }
    return 0;
}

```

点个赞就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值