154. Find Minimum in Rotated Sorted Array II

154. Find Minimum in Rotated Sorted Array II

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e.,  [0,1,2,4,5,6,7] might become  [4,5,6,7,0,1,2]).

Find the minimum element.

The array may contain duplicates.

Example 1:

Input: [1,3,5]
Output: 1

Example 2:

Input: [2,2,2,0,1]
Output: 0

Note:

 

Approach #1:

class Solution {
public:
    int findMin(vector<int>& nums) {
        int len = nums.size();
        int l = 0, r = len - 1;
        while (l <= r) {
            while (nums[l] == nums[l+1] && r > l) l++;
            while (nums[r] == nums[r-1] && r > l) r--;
            int m = l + (r - l) / 2;
            if (l == r) return nums[l];
            if (nums[r] > nums[l])
                return nums[l];
            if (nums[m] > nums[m+1]) return nums[m+1];
            if (nums[m] < nums[m-1]) return nums[m];
            if (nums[m] > nums[l])
                l = m + 1;
            else 
                r = m - 1;
        }
        return -1;
    }
};

Runtime: 4 ms, faster than 98.95% of C++ online submissions for Find Minimum in Rotated Sorted Array II.

Analysis:

this problem have the same idea with `154. Find Minimum in Rotated Sorted Array I`, the only different is when we meet the same element, we should let l++ or r-- in the legal range.