## [Leetcode]153. Find Minimum in Rotated Sorted Array(C++)

### 题目描述

Suppose an array of length n sorted in ascending order is rotated between 1 and n times. For example, the array nums = [0,1,2,4,5,6,7] might become:

• [4,5,6,7,0,1,2] if it was rotated 4 times.
• [0,1,2,4,5,6,7] if it was rotated 7 times. Notice that rotating an array [a[0], a[1], a[2], ..., a[n-1]] 1 time results in the array [a[n-1], a[0], a[1], a[2], ..., a[n-2]].

Given the sorted rotated array nums of unique elements, return the minimum element of this array.

### 例子

#### 例子 1

Input: nums = [3,4,5,1,2] Output: 1 Explanation: The original array was [1,2,3,4,5] rotated 3 times.

#### 例子 2

Input: nums = [4,5,6,7,0,1,2] Output: 0 Explanation: The original array was [0,1,2,4,5,6,7] and it was rotated 4 times.

#### 例子 3

Input: nums = [11,13,15,17] Output: 11 Explanation: The original array was [11,13,15,17] and it was rotated 4 times.

### Constraints

• n == nums.length
• 1 <= n <= 5000
• -5000 <= nums[i] <= 5000
• All the integers of nums are unique.
• nums is sorted and rotated between 1 and n times.

### 解题思路

• Left < Right：由于数组不包括重复数字，显然这种情况下数组本身有序，返回第一个元素即可
• Mid > Left: 可以确定 MidA 中，因此收缩左边界：Left = Mid + 1
• Mid <= Left：可以确定 MidB 中，因此收缩右边界，但是这里注意我们要获取的是 B 中第一个元素，所以 Mid 本身还有合理的搜索范围中，因此： Right = Mid

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

return nums[left];
}
};
• 时间复杂度: O(log n)
• 空间复杂度: O(1)

GitHub 代码同步地址： 153.FindMinimumInRotatedSortedArray.cpp

Built with Hugo
Theme Stack designed by Jimmy