旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。  

本题目比较简单,先叙述我个人的思路:

由于数组本身是一个递增结构,原先在前面较小的数值,被放到了数组后面,如果从前往后遍历,遇到一个比前一个数小的数值,那么说明找到了最小值。

注意只需要遍历到数组倒数第二个元素,若遍历到了最后,便不是旋转数组。

注意前几位数值相等的情况,比如2,2,2,0,1。

class Solution {
    public int minArray(int[] numbers) {
        for(int i = 0; i < numbers.length-1;i++){
            if(numbers[i] > numbers[i+1])  return numbers[i+1];
        }
        return numbers[0];

    }
}

时间复杂度为O(n)。

二分查找方法:经典算法,从左右两端查找。快,

class Solution {
    public int minArray(int[] numbers) {
        int low = 0;
        int high = numbers.length - 1;
        while (low < high) {
            int pivot = low + (high - low) / 2;
            if (numbers[pivot] < numbers[high]) {
                high = pivot;
            } else if (numbers[pivot] > numbers[high]) {
                low = pivot + 1;
            } else {
                high -= 1;
            }
        }
        return numbers[low];
    }
}

时间复杂度为O(logn)。

上一篇:2021-10-04


下一篇:2.2 用函数实现反弹球消砖块