153. Find Minimum in Rotated Sorted Array

问题描述:

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.

You may assume no duplicate exists in the array.

Example 1:

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

Example 2:

Input: [4,5,6,7,0,1,2]
Output: 0

 

解题思路:

使用二分搜索来解答这道题,和81. Search in Rotated Sorted Array II以及33. Search in rotated sorted array类似

先观察一下短数组所有可能的rotate:

0 1 2 3 4 5 6

6 0 1 2 3 4 5

5 6 0 1 2 3 4

4 5 6 0 1 2 3

3 4 5 6 0 1 2

2 3 4 5 6 0 1

1 2 3 4 5 6 0

 

若nums[mid] < nums[right]:  则说明右半部分是有序的此时最小值也可能是nums[mid]

若nums[mid] > nums[left]:则说明左半部分是有序的

 

我们就到另一半部分去找。

若出现left和mid重合的情况,此时会陷入死循环,我们应该跳出循环然后判断nums[mid] 和 nums[right]谁最小

例:3 4 5 1 2

最后left和mid为5的下标,right为1的下表 

代码:

class Solution {
public:
    int findMin(vector<int>& nums) {
        int left = 0;
        int right = nums.size()-1;
        int mid;
        while(left < right){
            mid = left + (right-left)/2;
            if(left == mid)
                break;
            if(nums[mid] < nums[right]){
                right = mid;
            }else if(nums[mid] > nums[right]){
                left = mid;
            }
        }
        return min(nums[mid],nums[right]);
    }
};

 

posted @ 2018-06-26 00:26  妖域大都督  阅读(112)  评论(0编辑  收藏  举报