剑指 Offer 11. 旋转数组的最小数字

①暴力解法

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

旋转数组性质:
剑指 Offer 11. 旋转数组的最小数字
②二分算法

class Solution {
    public int minArray(int[] numbers) {
          int len = numbers.length;
        if (len == 0) {
            return 0;
        }
        int left = 0;
        int right = len - 1;
        while (left < right) {
            int mid = (left + right) >>> 1;
            if (numbers[mid] > numbers[right]) {
                // [3, 4, 5, 1, 2],mid 以及 mid 的左边一定不是最小数字
                // 下一轮搜索区间是 [mid + 1, right]
                left = mid + 1;
            } else if (numbers[mid] == numbers[right]) {
                // 只能把 right 排除掉,下一轮搜索区间是 [left, right - 1]
                right = right - 1;
            } else {
                // 此时 numbers[mid] < numbers[right]
                // mid 的右边一定不是最小数字,mid 有可能是,下一轮搜索区间是 [left, mid]
                right = mid;
            }
        }

        //最小数字一定在数组中,因此不用后处理
        return numbers[left];
    }
}
上一篇:LeetCode 167. 两数之和 II - 输入有序数组


下一篇:JS翻转数组