1. 這一題和leetcode153最大的區別就是可以擁有重複元素.
2. 照例使用二分查找, 重點看下else那裏,最長的註釋部分解釋.
3. 可以參考二分查找模板, https://blog.csdn.net/qieyuan4083/article/details/102526281, 這是二分查找通用模板.
class Solution {
public:
int findMin(vector<int>& nums) {
if(nums.size()==1) return nums[0];
int len = nums.size()-1;
int start=0, end=len;
while(start<=end) {
int mid = start + (end-start)/2;
//如果mid值大於當前範圍的最後一個數,則最小值應當在右側.
if(nums[mid]>nums[end]) start = mid+1;
//如果小於.
else if(nums[mid]<nums[end]) {
//如果mid爲0或者前一個數大於後一個數,則直接返回mid值.
if(mid==0 || nums[mid-1]>nums[mid]) return nums[mid];
//否則最小值在左側.
else end = mid-1;
}
//如果mid值和end值相等.
else {
//如果mid==end, 說明當前只剩下一個值,一定是最小的.
if(mid==end) return nums[mid];
//否則類似[1,1,1,0,1]或[1,0,1,1,1]這種形式,沒辦法判斷0在mid左邊
//還是右邊,此時令end=end-1. 因爲如果nums[end]爲最小值,則
//nums[mid]==nums[end],nums[mid]也是最小值,end-1不影響.
end = end-1;
}
}
return -1;
}
};