【题目传送门】
二分
首先找到这串数字中间位置的那个数,然后与需要查询的数比较
如果要查询的数小于中间那个数,那么答案肯定在左边
如果要查询的数大于中间那个数,那么答案肯定在右边
如果等于的话继续在左边找,因为找到的位置还不能确定是第一个数
如此重复,直到要查询的区域变为1。
AC代码
#include <iostream>
#include <cstdio>
#define SIZE (int)1e6 + 10
using namespace std;
int a[SIZE], n, m;
int Seach(const int &);
int main() {
freopen("cpp.in", "r", stdin);
freopen("cpp.out", "w", stdout);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
for (int i = 1; i <= m; ++i) {
int x;
scanf("%d", &x);
printf("%d ", Seach(x));
}
return 0;
}
int Seach(const int &x) {
int l = 1, r = n, middle;
while (l <= r) {
middle = (l + r) >> 1;
if (l == r) {
if (a[l] == x) {
return l;
}
return -1;
} else if (x <= a[middle]) {
r = middle;
} else {
l = middle + 1;
}
}
}