数的范围【AcWing】
采用二分查找算法求有序序列中某个数的左右边界, 求左边界时mid下取整,mid下标上的元素与目标值相等时,处理方式等同于比目标值大的元素。
求右边界时mid上取整,mid下标上的元素与目标值相等时,处理方式等同于比目标值小的元素。
#include<stdio.h>
#define N 100010
int n, m, nums[N], x;
void left(int x)
{
int l = 0, r = n - 1;
while(l < r)
{
int mid = l + r >> 1;
if(nums[mid] < x) l = mid + 1;
else r = mid;
}
if(nums[l] != x) l = -1;
printf("%d ", l);
}
void right(int x)
{
int l = 0, r = n - 1;
while(l < r)
{
int mid = l + r + 1 >> 1;
if(nums[mid] > x) r = mid - 1;
else l = mid;
}
if(nums[r] != x) r = -1;
printf("%d\n", r);
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++)
scanf("%d", &nums[i]);
for(int i = 0; i < m; i++)
{
scanf("%d", &x);
left(x);
right(x);
}
}