二分查找的具体步骤如下:
- 确定有序数组的起始和结束索引,分别记为 low 和 high。
- 计算中间索引 mid = (low + high) / 2。
- 比较目标值与中间元素:
- 如果目标值等于中间元素,则查找成功,返回中间索引。
- 如果目标值小于中间元素,则在左半部分继续查找,更新 high = mid - 1。
- 否则,在右半部分继续查找,更新 low = mid + 1。
- 重复上述步骤,直到找到目标值或查找范围为空
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e5+100;
int a[N];
int main(){
int n,q;
scanf("%d%d\n",&n,&q);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
while(q--){
int x;
cin>>x;
int i=0,j=n-1;
int ten;
while(i<j){
ten=i+j>>1;
if(a[ten]<x)i=ten+1;
else j=ten;
}
if(a[i]!=x){
cout<<"-1 -1"<<endl;
continue;
}
int y=i,m=n;
while(y+1<m){
int z=y+m>>1;
if(a[z]==a[i])y=z;
else m=z;
}
cout<<i<<" "<<y<<endl;
}
}