这个是算法基础课里的模板题
因为所有的数都是有顺序的正好可以用二分
第一个二分寻找左边界,如果当前a[mid]=目标数k,就往左找,也就是从左半区间找,r=mid;否则l=mid+1向右半区间寻找
第一个二分寻找右边界,如果当前a[mid]=目标数k,就往右找,也就是从右半区间找,l=mid;否则r=mid-1向左半区间寻找
mid=l+r>>1对应r=mid和l=mid+1;寻找符合条件的最小值
mid=l+r+1>>1对应l=mid和r=mid-1;寻找符合条件的最大值
mid=l+r>>1不能与l=mid同时出现,会死循环,mid=l+r+1>>1和r=mid同理
import java.util.;
import java.io.;
import java.math.*;
public class Main{
static Scanner sc=new Scanner(System.in);
public static void main(String[]args) {
int n=sc.nextInt();
int a[]=new int[100100];
int m=sc.nextInt();
for(int i=0;i[HTML_REMOVED]>1;
if(a[mid]>=k) {
r=mid;
}else {
l=mid+1;
}
}
if(a[l]==k) {
System.out.print(l+” “);
}else {
System.out.println(“-1 -1”);
continue;
}
l=0;
r=n-1;
while(l[HTML_REMOVED]>1;
if(a[mid]<=k) {
l=mid;
}else {
r=mid-1;
}
}
System.out.println(r);
}
}
}