题目链接:http://www.jxsfczx.cn:888/problem/40
时间:1 秒 空间:512 MB

题目描述

给一个n个数,m个查找数据k的命令,每个命令查找k在数列中的位置(如果不存在输出-1,如果存在输出k在n个数中的从小到大的排位)。

输入描述

第一行为n和m,表示n个数和m条命令 第二行有n个不重复的数字 第三行分别为m个数字,表示要查询的数k

输出描述

一行m个数字用空格隔开,分别表示每一个命令的K的位置

输入

5 3
25 12 4 9 87
4 29 25

输出

1 -1 4

说明

10<=n<=100000 , 1<=m<=10000 , 1<=a[i]<=2000000000

解题思路

二分查找。

#include <bits/stdc++.h>
using namespace std;
int points(int s[], int n, int k) {
    int l = 0, r = n - 1;
    while (l <= r) {
        int mid = (l + r) >> 1;
        if (s[mid] > k)
            r = mid - 1;
        else if (s[mid] < k)
            l = mid + 1;
        else return mid + 1;
    }
    return -1;
}
int main() {
    int n, m, k, s[100005];
    while (~scanf("%d%d", &n, &m)) {
        for (int i = 0; i < n; i++)
            scanf("%d", s + i);
        sort(s, s + n);
        while (m--) {
            scanf("%d", &k);
            printf("%d ", points(s, n, k));
        }
        printf("\n");
    }
    return 0;
}