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;
}
};