前言
Find Minimum in Rotated Sorted Array这道题存在的价值,大概就是让大家直观感受一下LeetCode上二分的题目真的很多。。。
题目
https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/
Suppose a sorted array 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.
分析
题目意思还是挺直白的,现有一个排好序的数组(升序),假设这个数组中发生了一次“旋转”(rotation),请求出目前最小的那个元素。这里的”rotation”与其理解为“旋转”,不如理解为“轮转”,也就是这个排好序的数组就跟个传送带那样,一部分本来在前面的元素跑到了后面去。此题二分可以直截了当地解出,关键就是理解一下这个“轮转”的情况。
发生了“轮转”,那么此时曾经的最小元素势必不在最前面,头部元素必大于尾部元素。因此,如果发现头元素就比尾元素小,那么必然头元素就是最小的(即没有“轮转”)。我们把最大元素和最小元素之间的界限称为“隔离带”(隔离带中是没有元素的)。然后把整个数组分为左右两侧,考察中间这个元素,如果它大于头元素,说明隔离带在右侧,否则在左侧,重复该操作,二分查找,最终的头元素就势必是原最小元素。
代码
class Solution {
public:
int findMin(vector<int>& nums) {
int head = 0, tail = nums.size()-1;
while (head < tail) {
if (nums[head] < nums[tail])
return nums[head];
int mid = (head + tail) / 2;
if (nums[mid] >= nums[head]) {
head = mid + 1;
} else {
tail = mid;
}
}
return nums[head];
}
};
其他
此题的升级版,Find Minimum in Rotated Sorted Array II,更interesting一些,题解在此。