a[mid]>=x;
注:如果当前的a[mid]
大于x
,说明答案在左边,那我们就往当前的x
的左边去寻找答案。
更新r=mid;
否则说明答案在右边,那我们就往当前的x
的左边去寻找答案。
更新l=mid+1;
a[mid]<=x;
注:如果当前的a[mid]
小于x
,说明答案在右边,那我们就往当前的x
的右边去寻找答案
。更新l=mid
否则说明答案在左边,那我们就往当前的x
的左边去寻找答案。
更新 r=mid-1;
二分到最后,l=r
,输出l
或者r
即可,需要注意边界问题。
import java.util.*;
public class Main{
static int N=100010;
static int a[]=new int[N];
public static void main(String []args){
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int q=scan.nextInt();
for(int i=0;i<n;i++){
a[i]=scan.nextInt();
}
while(q-->0){
int x=scan.nextInt();
int l=0,r=n-1;
while(l<r){
int mid=l+r>>1;
if(a[mid]>=x)r=mid;
else l=mid+1;
}
if(a[l]!=x)System.out.println("-1 -1");
else{
System.out.print(l+" ");
l=0;r=n-1;
while(l<r){
int mid=l+r+1>>1;
if(a[mid]<=x)l=mid;
else r=mid-1;
}
System.out.println(l);
}
}
}
}