LeetCode: 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
解题思路
由于没有相同的数字出现, 因此可能出现的情况有以下几种:
- 没有翻转数字,如:
[0,1,2,3,4,5]
。 这种情况最小数字在最前面、 - 翻转数字后,中间数字在最小数字前,如:
[2, 3, 4, 5, 0, 1]
。这种情况最小数字在中间数字后面的区间。 - 翻转数字后, 中间数字在最小数字后, 如:
[4, 5, 0, 1, 2, 3]
。这种情况最小数字在中间数字前面的区间。
AC 代码
class Solution {
public:
// [beg, end)
int findMinRef(const vector<int>& nums, int beg, int end)
{
if(beg >= end) return INT_MAX;
if(beg + 1 == end) return nums[beg];
int mid = (beg+end)/2;
// 0 1 2 3 4 5 类型, mid = (0+6)/2 = 3
if(nums[beg] <= nums[mid] && nums[mid] <= nums[end-1])
{
return nums[beg];
}
// 4 5 0 1 2 3 类型, mid = (0+6)/2 = 3
else if(nums[beg] > nums[mid] && nums[mid] <= nums[end-1])
{
if(nums[mid] == nums[end-1]) return nums[mid];
return findMinRef(nums, beg, mid+1);
}
// 2 3 4 5 0 1, mid = (0+6)/2=3
else if(nums[beg] < nums[mid] && nums[mid] >= nums[end-1])
{
if(nums[mid] == nums[end-1]) return nums[beg];
return findMinRef(nums, mid, end);
}
}
int findMin(vector<int>& nums) {
return findMinRef(nums, 0, nums.size());
}
};