利用二分查找找出所给出的数在数组中的下标
输入格式:
第一行输入n和m表示数组有n个数据,m表示要对m个数进行查找
输出格式:
所有输出在一行完成,行末没有多余空格和多余回车。
输入样例:
5 5
1 2 3 4 5
1 2 3 4 5
思路1:
既然是查找,那便少不了map了
代码:
#include <bits/stdc++.h>
using namespace std;
map<int, int> res;
int n, m;
int main()
{
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
res[x] = i;
}
for (int i = 0; i < m; i++) {
int x;
scanf("%d", &x);
if (i)printf(" %d", res[x]);
else
printf("%d", res[x]);
}
return 0;
}
正经二分:
#include <bits/stdc++.h>
using namespace std;
int a[1000010];
int n, m;
int main()
{
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
a[i] = x;
}
for (int i = 0; i < m; i++) {
int x;
scanf("%d", &x);
int l = 0, r = n - 1;
while (l < r) {
int mid = l + r >> 1;
if (a[mid] == x) {
l = mid;
break;
}
if (a[mid] >= x)r = mid;
else l = mid + 1;
}
if (i)printf(" %d", l);
else printf("%d", l);
}
return 0;
}
偷懒二分:
主要是使用了lower_bound实现二分,大家可以自行百度
#include <bits/stdc++.h>
using namespace std;
vector<int> a;
int n, m;
int main()
{
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
a.push_back(x);
}
for (int i = 0; i < m; i++) {
int x;
scanf("%d", &x);
int res = lower_bound(a.begin(), a.end(), x) - a.begin();
if (i)printf(" %d", res);
else printf("%d", res);
}
return 0;
}