二分的时间复杂度是O(log n)
789. 数的范围
本题使用遍历查找会超时,应使用二分
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <math.h>
using namespace std;
int main()
{
//读取数据
int n, q;
cin >> n >> q;
int arr[n];
int tar[q];
for(int i=0; i<n; i++) cin >> arr[i];
for(int i=0;i<q;i++) scanf("%d", &tar[i]);
//二分模版
for(int i=0; i<q; i++) //遍历q次
{
//右端点 第一个比tar大的数
int l=0, r=n-1;
while(l<r)
{
int mid = l + r >> 1;
if(arr[mid]>=tar[i]) r=mid;
else l=mid+1;
}
int a=0;
if(arr[l]==tar[i]) a=l;
else a=-1;
l=0, r=n-1;
while(l<r)
{
int mid = l + r + 1 >> 1;
if(arr[mid]<=tar[i]) l=mid;
else r=mid-1;
}
int b=0;
if(arr[l]==tar[i]) b=l;
else b=-1;
cout << a << " " << b << endl;
}
return 0;
}