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

题目链接

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

题目分析

这个题很明显的二分查找题了,二分查找是最简单的算法,但是也是最难弄明白的算法。
这个题主要的问题是存在了相等的元素,如果遇到了相等的元素我们需要把right指针左移一位,做一个偏移然后再次检查。
然后就是当mid < right的时候,因为mid有可能是最小值,所以我们right移动到mid处。
当mid > right的时候,说明mid不可能是最小值了,因为其右边有比他更小的,并且left是一定会大于right,所以我们直接抛弃mid的元素,left = mid + 1。
注意好边界问题就很容易写出代码了

代码实现

class Solution {
    public int minArray(int[] numbers) {
        int left = 0;
        int right = numbers.length-1;
        while(left < right){
            int mid = left + ((right - left) >> 1);
            if(numbers[mid] < numbers[right]){
                right = mid;
            }else if(numbers[mid] > numbers[right]){
                left = mid + 1;
            }else{
                right--;
            }
        }
        return numbers[right];
    }
}
原文地址:https://www.cnblogs.com/ZJPaang/p/13358833.html