题目链接:https://www.acwing.com/problem/content/description/20/
题目如下:
思路:
当出现如下的包含重复元素的vector时,需要先去重,然后再使用二分。
解法一:
class Solution {
public:
int findMin(vector<int>& nums) {
if(nums.size()==0) return -1;
int l=0,r=nums.size()-1;
while(l<r&&nums[r]==nums[0]) r--;//如果头和尾元素相同时,去重
if(nums[l]<=nums[r]) return nums[0];//本身是有序的,或者所有数据值都相同
while(l<r){
int mid=l+r>>1;
if(nums[mid]<nums[0]) r=mid;
else l=mid+1;
}
return nums[r];
}
};
解法二:
class Solution {
public:
int findMin(vector<int>& nums) {
if(nums.size()==0) return -1;
//二分法,升序排序,且可以明显的两分
int low=0,high=nums.size()-1,mid;
while(low<high){
mid=(low+high)>>1;
if(nums[high]<nums[mid]) low=mid+1;
else if(nums[high]>nums[mid]) high=mid;
else if(nums[high]==nums[mid]) high--;//防止存在相同元素的干扰
}
return nums[low];
}
};