蒜头君手上有个长度为?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。
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>
void quicksort (int left,int right,int arr[])
{
int i,j,t,temp;
if (left>right)
return;
temp=arr[left];//temp中存的就是基准数
i=left;
j=right;
while (i!=j)
{
//注意顺序,一定要先右后左
while (arr[j]>=temp&&i<j)
j--;
while (arr[i]<=temp&&i<j)
i++;
//交换两个数在数组中的位置
if (i<j)//当哨兵ij在数组中没有相遇时
{
t=arr[i];
arr[i]=arr[j];
arr[j]=t;
}
}
//将基准数归位
arr[left]=arr[i];
arr[i]=temp;
//递归
quicksort(left,i-1,arr);
quicksort(i+1,right,arr);
return;
}
int main ()
{
int n,m,i;
scanf("%d %d",&n,&m);
int arr[n];
int number[m];
int sz;//定义数组长度
for (i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
quicksort (0,n-1,arr);//调用函数排序
sz=sizeof (arr)/sizeof(arr[0]);//计算数组长度
for (i=0;i<m;i++)//用数组记录需要寻找的数
{
scanf("%d",&number[i]);
int getchar();//去掉回车
}
for (i=0;i<m;i++)//用二分法判断数组
{
int left=0;
int right=sz-1;
while (left<=right)
{
int mid=(left+right)/2;
if (number[i]<arr[mid])
{
right=mid-1;
}
else if (number[i]>arr[mid])
{
left=mid+1;
}
else
{
printf("YES\n");
break;
}
}
if (left>right)
{
printf("NO\n");
}
}
return 0;
}