题目
蒜头君手上有个长度为 n 的数组 A。由于数组实在太大了,所以蒜头君也不知道数组里面有什么数字,所以蒜头君会经常询问整数 x是否在数组 A中。
输入格式
第一行输入两个整数 n 和 m,分别表示数组的长度和查询的次数。
接下来一行有 n个整数 ai。
接下来 m行,每行有 1个整数 x,表示蒜头君询问的整数。
输出格式
对于每次查询,如果可以找到,输出"YES",否则输出"NO"。
数据范围
1≤n,m≤105,0≤x≤106
Sample Input
10 5
1 1 1 2 3 5 5 7 8 9
0
1
4
9
10
Sample Output
NO
YES
NO
YES
NO
代码
#include<stdio.h>
#define MAX 1000005
int a[MAX];
int main(void){
int m,n;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
int num;
scanf("%d",&num);
a[num]++;
}
for(int j=0;j<m;j++){
int x;
scanf("%d",&x);
if(a[x]!=0){
printf("YES\n");
}
else printf("NO\n");
}
return 0;
}
思路
该题有两种思路一是先排序后使用二分查找,二是利用桶排的思想。上面代码是第二种思想,我们把输入的数作为数组的下标,该数出现就在相对应的下标对应得值上加一,就这样把n个整数遍历一遍,我们随机输入一个数,判断它在不在该数组中,只需要判断该下标对应的值是否为0,如果为0则不在,不为0就在。使用开辟数组的方法时间复杂度小但是空间复杂度大。