• 算法题:局部最小值


    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;
        }
  • 相关阅读:
    大话设计模式之备忘录模式
    大话设计模式之模板方法模式
    大话设计模式之桥接模式
    大话设计模式之组合模式
    大话设计模式之适配器模式
    大话设计模式之原型模式
    大话设计模式之解释器模式
    大话设计模式之享元模式
    大话设计模式之迭代器模式
    dom操作排他思想
  • 原文地址:https://www.cnblogs.com/gabin/p/15955021.html
Copyright © 2020-2023  润新知