蒜头君手上有个长度为 nn 的数组 AA。由于数组实在太大了,所以蒜头君也不知道数组里面有什么数字,所以蒜头君会经常询问整数 xx 是否在数组 AA 中。
输入格式
第一行输入两个整数 nn 和 mm,分别表示数组的长度和查询的次数。
接下来一行有 nn 个整数 a_iai。
接下来 mm 行,每行有 11 个整数 xx,表示蒜头君询问的整数。
输出格式
对于每次查询,如果可以找到,输出"YES"
,否则输出"NO"
。
数据范围
1 \le n, m \le 10^5, 0 \le x \le 10^61≤n,m≤105,0≤x≤106
输入输出
输入 | 输出 |
10 5 1 1 1 2 3 5 5 7 8 9 0 1 4 9 10 | NO YES NO YES NO |
解题思路
可以用暴力解决,但是利用算法可以大大缩短运行时间,更加方便快捷。
利用二分法来解决查找问题,将要查找的数与整体数组的中间量作比较,如果比中间量大就把整体数组左边的变量删除,从而实现二分的方法。以此类推,到最后中间量等于需要查找的量,如果找不到就跳出。使用二分法的前提数组的整体已经排列好顺序啦。
代码
#include<stdio.h>
void quickSort(int left,int right,int str1[])
{
if (left >= right)
{
return;
}
int key = str1[left];
int low = left;
int high = right;
int s,j;
while (low < high)
{
while (low < high && str1[high] >= key)
{
high --;
}
while (low < high && str1[low] <= key)
{
low ++;
}
if (low < high)
{
int temp = str1[low];
str1[low] = str1[high];
str1[high] = temp;
}
}
str1[left] = str1[low];
str1[low] = key;
s = low - 1;
j = low + 1;
quickSort(left,s,str1);
quickSort(j,right,str1);
}
int main()
{
int n,m,g,x,h=0,z=0,i=0,num,num1,judge,left,right,mid,temp;
scanf("%d %d",&n,&m);
int str1[n],str2[m];
while(1)
{
scanf("%d",&num);
char c=getchar();
str1[i++] = num;
if(c=='\n')
{
break;
}
}
for(i=0;i<m;i++)
{
scanf("%d",&num1);
str2[i] = num1;
}
x = n - 1;
quickSort(0,x,str1);
for(i=0;i<m;i++)
{
left = 0;
right = n - 1;
while(right >= left)
{
mid = (right + left)/2;
if(str1[mid] < str2[i] )
{
left = mid + 1;
}
else if(str1[mid] > str2[i])
{
right = mid - 1;
}
else if(str1[mid] == str2[i])
{
judge = 1;
printf("YES\n");
break;
}
}
if (judge != 1)
{
printf("NO\n");
}
if (judge == 1)
{
judge = 0;
}
}
return 0;
}