1597: 数组查找(PIPIPOJ)
题目描述
给定一个包含n个整数的升序序列和m个待查询的数字x,请你查找序列中x第一次出现的位置,如果不存在输出-1。
输入
第一行输入序列长度n(1<=n<=1e5)和查询数量m(1<=m<=1e5)。
第二行输入n个整数,代表序列的值,序列每个元素的值x满足(0<=x<=1e6)。
接下来输入m个要查询的整数x(0<=x<=1e6)。
输出
对于每个查询,输出要查询的整数在序列中第一次出现的位置,若不存在,输出-1。
样例输入
5 3
0 2 2 4 5
2 4 3
样例输出
1
3
-1
题解1(C++版本)
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, m, a[N],x;
//二分查找
int check(int x){
int l = -1, r = n, mid; //设置成开区间(l,r),以便处理边界
while(l + 1 < r){
mid = (l + r)/2;
if(a[mid] >= x) r = mid; //可行区(满足条件的区域)的指针最后一定指向答案
else l = mid;
}
return (a[r] == x ? r : -1);
}
int main(){
scanf("%d%d", &n, &m);
for(int i = 0;i < n; i++) scanf("%d", &a[i]);
while(m--){
scanf("%d", &x);
printf("%d\n", check(x));
}
return 0;
}