算法-11.旋转数组的最小数字

2020-08-11  本文已影响0人  zzq_nene

方式一:直接遍历整个数组,出现后一个比当前位置的数字小的,即后一个就是最小值

    /**
     * 旋转数组的最小数字
     * 所谓旋转数组,即将一个数组最开始的若干个元素搬到数组的末尾
     * 比如数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转
     * 这就是将原数组的最开始两个元素搬到了数组的末尾
     * @param numbers
     * @return
     */
    public static int minArray1(int[] numbers) {
        if (numbers.length == 0) {
            return -1;
        }
        for(int i=0;i<numbers.length-1;i++){
            if(numbers[i]>numbers[i+1]) {
                return numbers[i+1];
            }
        }
        return numbers[0];
    }

方式二:采用二分查找法

    /**
     * 旋转数组的最小数字
     * 所谓旋转数组,即将一个数组最开始的若干个元素搬到数组的末尾
     * 比如数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转
     * 这就是将原数组的最开始两个元素搬到了数组的末尾
     * @param numbers
     * @return
     */
    public static int minArray(int[] numbers) {
        if (numbers.length == 0) {
            return 0;
        }
        int low = 0;
        int height = numbers.length - 1;
        while (low < height) {
            int mid = (height + low) / 2;
            if (numbers[mid] == numbers[low] && numbers[mid] == numbers[height]) {
                for (int i = low;i<height;i++) {
                    // 遍历数组,第一次出现下一个比上一个小的情况,那么下一个就是最小值
                    if (numbers[i] > numbers[i + 1]) {
                        return numbers[i+1];
                    }
                }
                // 如果整个遍历都没有出现下一个比上一个小的情况,那么第一个就是最小值
                return numbers[low];
            } else if (numbers[height] >= numbers[mid]) {
                // 如果最高位置的值大于等于中间位置的,则说明最小值在小于等于mid的部分
                height = mid;
            } else {
                low = mid + 1;
            }
        }
        return numbers[low];
    }
上一篇下一篇

猜你喜欢

热点阅读