P2249 【深基13.例1】查找

输入 n(n106) 个不超过 10^9的单调不减的(就是后面的数字不小于前面的数字)非负整数a1,a2,,an

然后进行 m(m105) 次询问。对于每次询问,给出一个整数 q(q≤10^9),要求输出这个数字在序列中的编号,如果没有找到的话输出 -1 。

输入格式:

第一行 2 个整数 n 和 m,表示数字个数和询问次数。

第二行 n 个整数,表示这些待查询的数字。

第三行 m 个整数,表示询问这些数字的编号,从 1 开始编号。

输出格式:m 个整数表示答案

思路:这道题采用二分法,何为二分法呢?个人见解就是在一个单调的数组中,先找出这个数组的中间值a,然后再将我们要找的这个数b与这个

中间值a比较,若是大于这个中间值,那么b就可能在左边,于是就得往左边移一步,left-1 若是小于a 那么就是在右边,rigth+1

所以,这道题我们先初始化l r,用mid代表中间位置,令mid=(l+r)/2 

若num[mid]=x,则输出

若num[mid]>x,给定值在区间l和mid-1之间,r=mid-1,反则 l=mid+1

若找不到就输出-1

#include <stdio.h>
int n,m,q,a[1000005];
int find(int x) //二分查找 
{
    int l=1,r=n;
    while (l<r)
    {
        int mid=l+(r-l)/2;
        if (a[mid]>=x)
        r=mid;
        else 
       l=mid+1;
    }
    if (a[l]==x) 
    return l; //找都了就输出他的位置 
    else 
    return -1; // 没找到输出-1 
}
int main()
{
    scanf("%d %d",&n,&m); //读入 
    for (int i=1 ; i<=n ; i++)
        scanf("%d",&a[i]); //还是读入 
    for (int i=1 ; i<=m ; i++)
    {
        scanf("%d",&q);
        int ans=find(q); //看看查找的结果 
        printf("%d ",ans); //输出 
    }
    return 0;
}

 

posted @ 2020-04-22 10:10  今天喝奶茶了吗  阅读(684)  评论(0)    收藏  举报