力扣154. 寻找旋转排序数组中的最小值 II

这一题和
力扣153. 寻找旋转排序数组中的最小值
类似
无非多了重复元素,对于重复元素我们只需要判断mid和r相同的时候让r- -
类似
力扣81. 搜索旋转排序数组 II
平常我都是用闭区间写二分
找最小值需要用一个ans来保存mid
因为闭区间二分循环结束可能l,r都无法指向最终的结果。
完整代码如下:
class Solution {
public:int findMin(vector<int>& nums) {int l=0;int r=nums.size()-1;int ans=INT_MAX;while(l<=r){int mid=(l+r)/2;ans=min(ans,nums[mid]);if(nums[mid]>nums[r]){l=mid+1;}else if(nums[mid]==nums[r]){r--;}else{r=mid-1;}}return ans;}
};
这里如果用开区间的话就能在循环结束后r指向的位置即为结果
class Solution {
public:int findMin(vector<int>& nums) {int l=-1;int r=nums.size()-1;int ans=INT_MAX;while(l+1<r){int mid=(l+r)/2;if(nums[mid]>nums[r]){//说明在第一个阶段l=mid;}else if(nums[mid]==nums[r]){r--;}else{//说明在第二个阶段r=mid;}}return nums[r];}
};
最好开区间也掌握。
时间复杂度平均O(logn)
最坏是O(n)
