经典二分查找
class Solution {
public:
int findMin(vector<int>& nums) {
int n=nums.size();
int ans=INT_MAX;
int left=0,right=n-1;
while(left<right){//让跳出循环时left和right重合
int mid=left+(right-left)/2;
//注意理解下细节,地板除,<,left<=mid<right
if(nums[mid]<nums[right]){
right=mid;//因为中值 < 右值,中值也可能是最小值,右边界只能取到mid处
}else{
left=mid+1;//因为中值 > 右值,中值肯定不是最小值,左边界可以跨过mid
}
}
return nums[left];
}
};
class Solution {
public:
int findMin(vector<int>& nums) {
int n=nums.size();
int left=0,right=n-1;
while(left<right){
int mid=left+(right-left)/2;
if(nums[mid]<nums[right]){
right=mid;
}else if(nums[mid]>nums[right]){
left=mid+1;
}else if(nums[mid]==nums[right]){
right--;//迭代条件0<=left<right保证了right不会越界
//此操作不会使最小值丢失[1,0,1,1,1],[1,1,1,0,1]分情况讨论[3,3,3]
}
}
return nums[left];
}
};