这道题目几乎没有什么好的解法。而leetcode的统计显示有接近0秒的解法,我不得而知。
我试了最基本的O(N)解法,与写得较好的二分法,在leetcode上甚至O(n)的解法更快。
AC不是唯一目的,这道题如果在面试中考察的应该是如何解决因重复而导致的退化问题。
其实要把问题想的简单一些,当发现首尾元素相同而无法二分时简单的采用线性办法就好了。
分享一个我觉得写得简单而优美的二分法(https://oj.leetcode.com/discuss/13800/my-c-solution-24ms-is-there-any-better-solution)
class Solution {
public:
int findMin(vector<int> &num) {
int start = 0;
int end = num.size()-1;
int mid;
while(start<end){
if(num[start]<num[end]) //if the remained array are sorted ,just break to return the first element.
break;
mid = (end+start)/2;
if(num[mid]>num[end]){ //mid is bigger, so it's useless. Just go forward
start = mid+1;
}
else if(num[mid]==num[end]){//special case! we know end <=start, so just erase the duplicated!
start++;
end--;
}
else //mid <end, Is mid < min < end possible? e.g. 1 1 1 0 1(mid) 1 2
end= mid; //as shown above,this never happen!
}
return num[start];
}
};
This solution is beautiful !