[剑指offer] 旋转数组的最小数字

题目

https://www.acwing.com/problem/content/description/20/

思路

因为数组可能包含重复项。所以有可能是下面这种排序方式:

这样子是不能用二分模板的,需要先处理成下面这个样子:

这时,左半边所有元素>=nums[0],右半边所有元素<nums[0],可以用模板。我们找到右半边第一个比第一个元素小的元素,即为满足题意的最小值。

Java代码

class Solution {
    public int findMin(int[] nums) {
        int n = nums.length;
        if(n == 0) return -1;
        n--;
        while(n>0 && nums[n] == nums[0]) n--; //找到右边第一个比nums[0]小的位置 注意n>0
        if(nums[n] >= nums[0]) return nums[0]; //有可能右半边处理之后不存在了,需要特殊判断一下
        //二分
        int l=0, r=n;
        while(l<r){
            int mid = l+(r-l)/2;
            if(nums[mid] < nums[0]) r = mid;
            else l = mid+1;
        }
        return nums[l];
    }
}
posted @ 2019-08-16 17:34  sqqq  阅读(101)  评论(0编辑  收藏  举报