算法题:局部最小值

1、什么叫局部最小值

 

局部指的是左 中 右

最小值,自然是三个值做比较取最小了

 

边界场景:索引0和索引1,这个场景下,如果是判断索引0位置是否最小值的话,此时只需要2个数相比。同理,最后一个数组元素也是2值相比

 

2、这道算法题其实还有个前提,就是相邻数不等,也就是说,不会出现 1 2 2这样的数组

 

3、这边只要随机取一个局部最小值即可

 

上述的这些条件才满足了可以二分的情况

 

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

    private static void test() {
        int[] arrays = getRandomArray();
        System.out.println(Arrays.toString(arrays));
        int left = 0;
        int right = arrays.length - 1;
        while (left <= right) {
            int mid = (left + right)>> 1;
            // 数组左边越界的情况下,则不判断与左侧值的最小
            // 数组右边越界的情况下,则不判断与右侧值的最小
            if ((mid + 1 >= arrays.length || arrays[mid] < arrays[mid + 1])
                    && ( mid - 1 < 0 || arrays[mid] < arrays[mid - 1])) {
                System.out.println("局部最小值索引:" + mid);
                System.out.println((mid - 1 > -1 ? arrays[mid - 1] + ":" : ":")
                        + arrays[mid]
                        + ":"
                        + (mid + 1 < arrays.length ? arrays[mid + 1] : "")
                );
                return;
            }
            // 如果当前值不满足局部最小,则一定是大于某一侧的值,这边只判断左侧值是否小于当前值,
            // 如果是的话,则舍去右侧的区域。否则舍去左侧区域
            if (mid - 1 >= 0 && arrays[mid] > arrays[mid - 1]) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
    }

    private static int[] getRandomArray() {
        //  取一个相邻不等的数组
        ThreadLocalRandom random = ThreadLocalRandom.current();
        int[] ints = new int[20];
        ints[0] = random.nextInt(100);
        for (int i = 1; i < ints.length; ) {
            int tmp = random.nextInt(100);
            // 只要不等于上一个数即可
            if (tmp != ints[i - 1]) {
                ints[i++] = tmp;
            }
        }
        return ints;
    }

 

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