蒜头君手上有个长度为 n 的数组 A。由于数组实在太大了,所以蒜头君也不知道数组里面有什么数字,所以蒜头君会经常询问整数 x 是否在数组 A 中。
输入格式
第一行输入两个整数 n 和 m,分别表示数组的长度和查询的次数。
接下来一行有 n 个整数 ai。
接下来 m 行,每行有 1 个整数 x,表示蒜头君询问的整数。
输出格式
对于每次查询,如果可以找到,输出"YES",否则输出"NO"。
数据范围
1≤n,m≤100000,0≤x≤1000000。
Sample 1
Input | Output |
10 4 1 1 1 2 3 5 5 7 8 9 0 1 4 9 | NO YES NO YES |
问题描述:
给定一个长度为n的数组,要求在数组里面查找是否含有x,
第一行输入n代表数组长度,m代表查询的次数;
第二行输入n个数;
然后输入要查询的数;
如果找到输出YES,找不到输出NO。
注:用二分法进行查找,不然会超限。
解题思路:
运用二分查找法进行解题。读入数组,对其进行排序,然后
赋予中间值mid=(left+right)/2;然后进行循环,当a[mid]>x时,即右
段过大,将right进行缩小处理(right=mid-1);当a[mid]<x时,同理,左
边过小,进行增大处理(left=mid+1),当left>right或者a[mid]=x循环结束。
注:mid-1与mid+1原因:因为进行缩小和增大处理时,mid已经进行比
较,故需进行-1或+1处理。
错误描述:
用逐个排序法进行排序时,时间超限,故采用c++中sort函数进行直接排序;
刚开始未进行+1与-1处理。
代码实现:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m, i, mid;
int x, a[100005];
scanf("%d%d", &n, &m);
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
sort(a, a + n);
while (m--) {
int left = 0, right = n - 1;
scanf("%d", &x);
int result = 0;
while (left <= right) {
mid = (left + right) / 2;
if (a[mid] < x) {
left = mid + 1;
} else if (a[mid] > x) {
right = mid - 1;
} else if (a[mid] == x) {
result = 1;
break;
}
}
if (result == 1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}