#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int n,q;
int fly[N];
int main ()
{
int k = 0;
scanf ("%d%d",&n,&q);//输入n个数和要查找的次数
for (int i = 0;i < n;i++)
{
scanf("%d",&fly[i]);
}
while (q--)
{
scanf ("%d",&k);
int left = 0;
int right = n - 1;
int mid = 0;
while (left < right)
{
mid = (left + right) >> 1;
if (fly[mid] >= k)
{
right = mid;
}
else
{
left = mid + 1;
}
}
if (fly[right] != k)
{
printf ("-1 -1\n"); //若未找到,输出-1 -1
}
else
{
printf ("%d ",right); //输出要查找的数最先出现的位置
left = 0;
right = n - 1;
mid = 0;
while (left < right)
{
mid = (left + right + 1) >> 1; //为什么要+1,避免死循环(边界问题)
if (fly[mid] <= k)
{
left = mid;
}
else
{
right = mid - 1;
}
}
printf ("%d\n",right); //输出要查找的数最后出现的位置
}
}
return 0;
}
二分寻找指定数出现的第一个位置的下标与最后一个位置出现的下标,若未找到则返回-1 -1 (c语言实现)
于 2022-03-20 11:14:44 首次发布