题目描述
和y总思路一样 只不过把求左右点 单独抽了一个函数;
还是需要向y总学习;
分析思路 check 函数的定义需要仔细理解
java 代码
import java.util.Scanner;
public class Main{
private static int n;
private static int q;
private static int k;
private static int[]nums;
public static void main(String []args){
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
nums=new int[n];
q=sc.nextInt();
for(int i=0;i<n;i++){
nums[i]=sc.nextInt();
}
while(q-->0){
k=sc.nextInt();
bSearch(k);
}
}
private static void bSearch(int x){
int index1=bSearch1(0,n-1,x);
if(nums[index1]!=x){
System.out.println("-1 -1");
return ;
}
int index2=bSearch2(0,n-1,x);
System.out.println(index1+" "+index2);
}
//找最左侧的起点 用模板1
private static int bSearch1(int l,int r,int x){
int mid;
while(l<r){
mid=l+r>>1;
if(nums[mid]>=x){
r=mid;
}else{
l=mid+1;
}
}
return l;
}
//找最右侧的终点 用模板2;
private static int bSearch2(int l,int r,int x){
int mid;
while(l<r){
mid=l+r+1>>1;
if(nums[mid]<=x){
l=mid;
}else{
r=mid-1;
}
}
return l;
}
}