二分查找模板

 

题目相关
题目链接
计蒜客,https://nanti.jisuanke.com/t/T1560。

题目描述
蒜头君手上有个长度为 n 的数组 A。由于数组实在太大了,所以蒜头君也不知道数组里面有什么数字,所以蒜头君会经常询问整数 x 是否在数组 A 中。

输入格式
第一行输入两个整数 n 和 m,分别表示数组的长度和查询的次数。

接下来一行有 n 个整数 ai​。

接下来 m 行,每行有 1 个整数 x,表示蒜头君询问的整数。

输出格式
对于每次查询,如果可以找到,输出"YES",否则输出"NO"。

样例输入
10 5
1 1 1 2 3 5 5 7 8 9
0
1
4
9
10
样例输出
NO
YES
NO
YES
NO
数据范围
1 ≤ n, m ≤10^5, 0 ≤ x ≤ 10^6。
分析
标准的二分查找模板。

题目要求
输入一个 x,在数组 A 中找到,输出"YES",否则输出"NO"。

编程思路
1、读入数组 A。

2、对 A 进行排序。

3、读入一个 x,在数组 a 二分查找 x 是否存在。

 

AC 参考代码

STL 版本

利用 algorith 库中 binary_search 函数。

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,m;
	cin>>n>>m;
	int a[n];
	for(int i=0;i<n;i++) cin>>a[i];
	sort(a,a+n);
	for(int i=0;i<m;i++)
	{
		int x;
		cin>>x;
		if(binary_search(a,a+n,x))//万能的库函数 
		{
			cout<<"YES\n";
		}
		else cout<<"NO\n";
	}
	return 0;
}

  

C++ 版本

自己实现一个类似 STL 的 binary_search 函数。

#include<bits/stdc++.h>
using namespace std;
int binary_search(int a[],int left,int right,int x)
{
    while(left<=right)
    {
        int mid=(left+right)/2;
        if(x==a[mid]) return mid;
        else if(x<a[mid]) right=mid-1;
        else left=mid+1;
    }
    return -1;
} 
int main()
{
    int n,m;
    cin>>n>>m;
    int a[n];
    for(int i=0;i<n;i++) cin>>a[i];
    sort(a,a+n);
    for(int i=0;i<m;i++)
    {
        int x;
        cin>>x;
        if(-1==binary_search(a,0,n-1,x)) cout<<"NO\n";
        else cout<<"YES\n";
    }
    return 0;
}

 

 

参考链接:

https://blog.csdn.net/justidle/article/details/104600447

 

posted @ 2020-07-26 12:27  龙龙666666  阅读(203)  评论(0编辑  收藏  举报