算法题:有序数组中找到小于指定数值的最左的位置

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            test();
        }
    }

    private static void test() {
        // 1、获取一个有序数组
        int i = ThreadLocalRandom.current().nextInt(100);
        int[] ints = ArraysUtils.getInts();
        Arrays.sort(ints);

        System.out.println("需要查找的数" + i);
        System.out.println(Arrays.toString(ints));

        // 2、定义左右边界
        int left = 0;
        int right = ints.length - 1;
        Integer result = null;
        // 3、定义终止条件
        while (left <= right) {
            // 3.1 二分取中间值
            int middle = (left + right) >> 1;

            int tmp = ints[middle];

            // 3.2 根据二分的中间值来分支,等于则找到,中间值大于查找值,则将范围往左移,剔除中间值这个位置;中间值小于查找值,则剔除中间值位置后往右切割
            if (tmp > i) {
                // -1是剔除中间值,由于是把右边界左移,所以是-1
                right = middle - 1;
            } else {
                // +1是剔除中间值,由于是把左边界右移,所以是+1
                left = middle + 1;
                result = middle;
            }
        }
        if (result == null) {
            System.out.println("没找着");
        } else {
            System.out.println("最左索引值"  + result);
        }
    }

与二分查找到指定值相比,这边的终止条件是二分到不能二分为止;然后最终取值是满足条件时候保存的索引值,这个值在每次中间值小于等于指定值的时候暂存的,每次满足条件的时候都会被替换。

posted @ 2022-03-02 12:14  gabin  阅读(63)  评论(0编辑  收藏  举报