Java里没有c++的lower_bound和upper_boud,要自己写
import java.util.Arrays;
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingDeque;
public class Main {
/** * 二分查找 当v在nums中出现时返回出现的第一个位置,否则返回一个idx,在这里插入v时nums仍有序 * @param nums 非降序数组 * @param l * @param r * @param v * @return */
static int lowerBound(int[] nums,int l,int r,int v){
while(l<r){
int m=l+((r-l)>>1);
if(nums[m]>=v){
r=m;
}
else{
l=m+1;
}
}
return l;
}
/** * 二分查找 当v在nums中出现时返回出现的最后一个位置的后一个位置,否则返回一个idx,在这里插入v时nums仍有序 * @param nums 非降序数组 * @param l * @param r * @param v * @return */
static int upperBound(int[] nums,int l,int r,int v){
while(l<r){
int m=l+((r-l)>>1);
System.out.println(l+" "+m+" "+r);
if(nums[m]>v){
r=m;
}
else{
l=m+1;
}
}
return l;
}
public static void main(String[] args) {
int[] nums=new int[]{
2,4,1,0,4,2,5};
Arrays.sort(nums);
for(int i:nums){
System.out.print(i+" ");
}
System.out.println();
System.out.println(lowerBound(nums,0,nums.length,4));
System.out.println(upperBound(nums,0,nums.length,4));
}
}