1. 程式人生 > >153. Find Minimum in Rotated Sorted Array

153. Find Minimum in Rotated Sorted Array

nim OS duplicate you put clas 一半 amp pos

問題描述:

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]); } };

153. Find Minimum in Rotated Sorted Array