思路:循环排序,二分法。注意存在相等值的情况。
class Solution {
public:int findMin(vector<int>& nums) {
int len=nums.size();
//判错
if(len<0) return -1;
if(len==1) return nums[0];
int left=0,right=len-1;
while(left<right){
int mid=(left+right)/2;
if(nums[left]<nums[right]){//1.左边<右边的情况
return nums[left];
}else if(nums[left]>nums[right]){//2.左边>右边情况
if(nums[mid]>=nums[left]){
left=mid+1;
}else{
right=mid;
}
}else{//3.左边=右边的情况
if(nums[mid]>nums[left]){//如果中间的大于左边的,在右半部分
left=mid+1;
}else if(nums[mid]<nums[left]){//如果中间的小于左边的,在左半部分
right=mid;
}else{//如果左边和中间和右边的值都相同,只能一个一个得遍历
int cur=left;
while(cur<right){
cur++;
if(nums[cur]<nums[left]){//找到第一个小的值,就是最小值
return nums[cur];
}else if(nums[cur]>nums[left]){//找到第一个大的值,最小值肯定在右边
left=cur+1;
break;
}
}
return nums[left];//如果全部值都相等,就随便返回一个
}
}
}
return nums[left];
}
};