在一个有序数组中,找>=某个数最左的位置和<=的最右的位置

public class BSNearLeft {
    public static int nearestIndex(int[] arr, int value) {
        int L = 0;
        int R = arr.length - 1;
        int mid = 0;
        int index = -1;
        while (L <= R) { //等于R是要把所有的数都测试完
            mid = L + ((R - L) >> 1);
            if (arr[mid] >= value) {
                index = mid;    //如果>=value 标记一个对号
                R = mid - 1;
            } else {
                L = mid + 1;
            }
        }
        return index;
    }

    public static void main(String[] args) {
        int[] arr = {0,0,0,1,1,2,2,2,2,2,2,3,3,3,3,3,4,4,4};
        int result = nearestIndex(arr,2);
        System.out.println(result);
    }
}

思路就是二分法,

一直二分到最后一个数如果最后一个数是>=目标值的,此时就是最左的位置

如果最后一个数不是>=目标值就说明上一次记录的index是最左的位置

测试用例运行结果:

 

找<=某个数最右的位置

public class BSNearRight {
    public static int nearestIndex(int[] arr,int value){
        int L = 0;
        int R = arr.length - 1;
        int mid = 0;
        int index = -1;
        while (L <= R) { //等于R是要把所有的数都测试完
            mid = L + ((R - L) >> 1);
            if (arr[mid] <= value) {
                index = mid;    //如果>=value 标记一个对号
                L = mid + 1;
            } else {
                R = mid - 1;
            }
        }
        return index;
    }
    public static void main(String[] args) {
        int[] arr = {0,0,0,1,1,2,2,2,2,2,2,3,3,3,3,3,4,4,4};
        int result = nearestIndex(arr,2);
        System.out.println(result);
    }
}

同样也是二分,条件相反就可以了

测试用例运行结果:

posted @ 2020-07-07 11:20  硬盘红了  阅读(569)  评论(0编辑  收藏  举报