二分法+时间复杂度(简单)
蒜头君手上有个长度为 n 的数组 A。由于数组实在太大了,所以蒜头君也不知道数组里面有什么数字,所以蒜头君会经常询问整数 x 是否在数组 A 中。
输入格式
第一行输入两个整数 n和 m,分别表示数组的长度和查询的次数。
接下来一行有 n个整数 ai
。
接下来 mm 行,每行有 11 个整数 xx,表示蒜头君询问的整数。
输出格式
对于每次查询,如果可以找到,输出"YES",否则输出"NO"。
数据范围
n, m 1≤n,m≤10 ^5
,0≤x≤10 ^6
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 str1[])//快排
{
if (left >= right)
{
return;
}
int key = str1[left];
int low = left;
int high = right;
int x,y;
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;
x = low - 1;
y= low + 1;
quickSort(left,x,str1);
quickSort(y,right,str1);
}
int main()
{
int n,m,g,x,h=0,z=0,i=0,num,num1,judge=0,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;
}