二分查找模板
题目相关
题目链接
计蒜客,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