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

时间:2020-07-22 11:02:14   收藏:0   阅读:73

题目链接

剑指 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

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!