思路:这是最典型和基础的二分查找题,因为符合单调性和有界性,如果直接暴力查找的话,会超时,只需要用一下二分即可
左边界为:0(因为编号最小为1)
右边界为:n+1(因为编号最大为n)
又因为要找的是第一次出现的编号,所以等于时,右边界是要往左缩的
所以 >= 为一类, < 为一类
接下来套二分模板即可
int arr[1000005];
int n, m, num;
int func(int* arr, int num)
{int l = 0, r = n + 1; //左边界和右边界while (l + 1 < r) {int mid = (l + r) / 2; //二分if (arr[mid]<num) //如果该编号对应的值比查找的小{l = mid; //左边界提高}else //如果该编号对应的值比查找的大或者相等{r = mid; //右边界降低}}if (arr[r] == num) //如果等于查找的数{return r; //返回编号}else //没有该数{return -1;}}
int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++){scanf("%d", &arr[i]);}for (int i = 1; i <= m; i++){scanf("%d", &num);printf("%d ", func(arr, num));}return 0;
}