【两次过】Lintcode 160. 寻找旋转排序数组中的最小值 II

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/majichen95/article/details/82555627

假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2)。

你需要找到其中最小的元素。

数组中可能存在重复的元素。

样例

给出[4,4,5,6,7,0,1,2]  返回 0

注意事项

The array may contain duplicates.


解题思路:

相比于上一道Lintcode 159. 寻找旋转排序数组中的最小值,此题多了重复元素的条件,注意考虑重复元素同时出现在首尾的情况,例如[1,1,-1,1],这样的话就不能利用r元素的大小来判断mid所在的区间了,此时就只能移动r元素,直到它不等于l的值,即可判断。

就多了两行代码,如下:

public class Solution {
    /**
     * @param nums: a rotated sorted array
     * @return: the minimum number in the array
     */
    public int findMin(int[] nums) {
        // write your code here
        if(nums[0] < nums[nums.length-1])
            return nums[0];
        
        int l = 0;
        int r = nums.length-1;
        
        while(nums[l]==nums[r] && r>0)
            r--;
        
        while(l<r){
            int mid = (r-l)/2+l;
            if(nums[mid]>nums[r])
                l = mid + 1;
            else
                r = mid;
        }
        
        return nums[l]<nums[r]?nums[l]:nums[r];
    }
}

猜你喜欢

转载自blog.csdn.net/majichen95/article/details/82555627
今日推荐