题目
输入 n个不超过 10^9的单调不减的(就是后面的数字不小于前面的数字)非负整数 a1,a2,…,an,然后进行 m 次询问。对于每次询问,给出一个整数 q,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 -1 。
本题思路
二分答案法找位置
代码
#include<bits/stdc++.h>
using namespace std;
int n, m;
const int N=1e6+2;
int a[N];
//二分答案法
int search(int arr[], int n, int x){
int low=1, high=n, mid, res=-1;
while(low<=high){
mid=(low+high)>>1;
if(a[mid]==x){
res=mid;
high=mid-1;
}
else if(a[mid]>x){
high=mid-1;
}
else{
low=mid+1;
}
}
return res;
}
int main(){
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);
int res = search(a, n, x);
printf("%d ", res);
}
return 0;
}