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

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

二分
要注意的是,由于存在重复数字,所以初始状态可能不满足二分的性质。不满足的情况是:左边开始的数字和右边结束的数字相等,所以一开始要缩小右边界,让右边界的数字小于第一个数字。这样左边的数字都大于等于第一个数字,右边的数字都小于第一个数字,两个区间的性质不同,就可以进行二分了。还有排除递增的情况。

class Solution {
    public int minArray(int[] numbers) {
        int l = 0, r = numbers.length - 1;
        while(r > 0 && numbers[r] == numbers[0]) r--;  // 缩小右边界
        if(numbers[r] >= numbers[0]) return numbers[0];  // 排除递增的情况

        while(l < r){
            int mid = (l + r) >> 1;
            if(numbers[mid] >= numbers[0]) l = mid + 1;
            else r = mid;
        }

        return numbers[l];
    }
}

你可能感兴趣的:(#,剑指offer,算法)