起初感觉这题挺水的,不就是遍历一遍找到最小值么?水过后系统提示解锁了Solution,点进去一看发现是我自己比较水。。。
人家给的是排序好的Array,你丫还O(n)不是丢人么。。。
思路如下:
数组[AL , AL+1,...,AR],如果没有旋转,这必然AL<AR 。
见数组分成两份,[AL , AL+1,...,AK]、[AK,AK+1,...,AR];只要数组进行了旋转,这必有AL>AR。
OK,我们现在去AM1作为分割点,比较AM1与AR。
- 如果AM1>AR,则必有[AL,...,AM1]中数据皆大于AR。所以min num必然在[AM1+1,... , AR]中。
- 如果AM1<AR,则必有[AM1+1,.... ,AR]中数据皆大于AM1。所以min num必然在[AL,...,AM1]中。
上图:
所以我们以此方法,可使复杂度变为O(logn)。
那么何时结束呢?
类似于二分查找,在L = R时,查找结束!
class Solution {
public:
int findMin(vector<int> &num) {
//Solution one : O(n)
/*
int idx,min;
min = 2147483647;
for(idx = 0 ; idx < num.size() ; idx++)
{
if(min > num[idx])
{
min = num[idx];
}
}
return min;*/
//Solution two : O(logn)
int Ar,Am,l,r,m;
l = 0;
r = num.size()-1;
while(l!=r)
{
m = (l+r)>>1;
Ar = num[r];
Am = num[m];
if(Am < Ar)
{
r = m;
}
else
{
l = m + 1;
}
}
return num[l];
}
};