LC153. 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
代码
排序$O(nlogn)$
class Solution {
public:
int findMin(vector<int>& nums) {
sort(nums.begin(), nums.end());
return nums[0];
}
};
二分
算法
(二分) $O(logn)$
处理这种问题有个常用技巧:如果不想处理边界情况,比如当数组只有两三个数的时候,代码会出问题。我们可以在数组长度太短(这道题中我们判断数组长度小于5)时,直接暴力循环做;数组有一定长度时再用二分做。
这样做并不会影响算法的时间复杂度,但会缩短写代码的时间。
为了便于理解,我们将数组中的数画在二维坐标系中,横坐标表示数组下标,纵坐标表示数值,如下所示:
我们会发现数组中最小值前面的数 $nums[i]$ 都满足:$nums[i]≥nums[0]$,其中 $nums[n−1]$是数组最后一个元素;而数组中最小值后面的数(包括最小值)都不满足这个条件。
所以我们可以二分出最小值的位置。
另外,不要忘记处理数组完全单调的特殊情况。
时间复杂度分析:二分查找,所以时间复杂度是 $O(logn)$.
作者:yxc
链接:https://www.acwing.com/solution/LeetCode/content/247/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public:
int findMin(vector<int>& nums) {
if (nums.back() > nums[0]) return nums[0];
int l = 0, r = nums.size() - 1;
while (l < r)
{
int mid = l + r >> 1;
if (nums[mid] >= nums[0]) l = mid + 1;
else r = mid;
}
return nums[l];
}
};