【题目】
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.
【tips】题目的意思是找出一个旋转后的有序数组的最小值,值得注意的是,旋转点可能不是数组中间,即:
可能是 4 5 6 7 0 1 2
//在2进行旋转
也可能是0 1 2 3 4 5 6 7
//在7进行旋转
当然,还要考虑数组长度为0或者1的情况。
题解
这道题最简单的方法当然还是直接用遍历数组,记录最小的值。这样的算法复杂度是Ο(n)。当数组比较小的时候,遍历还是比较好的一个解决办法。但是对于大数组,效率就会比较低了。
我注意到,旋转后的数组可以分为两部分,左边和右边,左边的每一个数都比右边的每一个数大。
4 5 6 7
vs 0 1 2
所以我想到可以用二分查找的办法。
如果mid>rihgt (right表示数组最后一个数),那么mid就是属于左边的
大
数,对右边的部分数组mid~right重复二分查找。
否则就是属于左边的小
数,对左边的部分数组left~mid重复二分查找。
一直循环,直到找到最小值。
这样的做法的算法复杂度是O(logn)
代码
using namespace std;
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[mid] > nums[right])
{
left = mid + 1;
}
else
{
right = mid;
}
}
return nums[left];
}
};