题解 | 查找

查找

https://www.nowcoder.com/practice/d93db01c2ee44e8a9237d63842aca8aa

//查找(二分查找)

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;

//设计compare函数(升序排列,左小右大),sort默认升序,也可以不用写这个函数
bool compare(int lhs,int rhs){
    if(lhs<rhs){    //满足条件,不用交换,返回true
        return true;
    }else{  //需要交换,返回false
        return false;
    }
}

//二分查找
void md(vector<int> arr,int key,int n){ //传入数组,要查找的元素,数组长度
    int left=0; //左边left初始指向最左边元素,下标为0
    int right=n-1;  //右边right初始指向最右边元素,下标为n-1

    while(left<=right){  //左右边界相等的时候,也要判断一次
        int mid=(left+right)/2; //mid是中间位置元素下标
        if(arr[mid]>key){   //若key更小,则说明在左边
            right=mid-1;    //往左边走
        }else if(arr[mid]<key){ //若Key比中间值更大,说明在右边
            left=mid+1; //往右边走
        }else if(arr[mid]==key){  //相等说明找到了
            printf("YES\n");
            break;
        }
    }
    if(left>right){ //没找到
        printf("NO\n");
    }
}

//主函数
int main(){
    int n;  //n为数组长度
    while(scanf("%d",&n)!=EOF){
        vector<int> a(n);   //a数组长度为n
        for(int i=0;i<n;i++){   //输入数组元素
            scanf("%d",&a[i]);
        }

        int m;
        scanf("%d",&m); //m个要查找的数字
        vector<int> b(m);   //b数组用于记录要查找的数字
        for(int i=0;i<m;i++){   //输入要查找的数字
            scanf("%d",&b[i]);
        }

        sort(a.begin(),a.end(),compare);    //对a数组进行排序
        for(int i=0;i<m;i++){   //遍历b数组,在a数组里面查找它们
            md(a,b[i],n);  //二分查找
        }
    }

    return 0;
}

全部评论

相关推荐

找工作勤劳小蜜蜂:自我描述部分太差,完全看不出想从事什么行业什么岗位,也看不出想在哪个地区发展,这样 会让HR很犹豫,从而把你简历否决掉。现在企业都很注重员工稳定性和专注性,特别对于热爱本行业的员工。 你实习的工作又太传统的it开发(老旧),这部分公司已经趋于被淘汰,新兴的互联网服务业,比如物流,电商,新传媒,游戏开发和传统的It开发有天然区别。不是说传统It开发不行,而是就业岗位太少,基本趋于饱和,很多老骨头还能坚持,不需要新血液。 工作区域(比如长三角,珠三角,成渝)等也是HR考虑的因素之一,也是要你有个坚定的决心。否则去几天,人跑了,HR会被用人单位骂死。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务