Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., [0,1,2,4,5,6,7]
might become [4,5,6,7,0,1,2]
).
Find the minimum element.
The array may contain duplicates.
Example 1:
Input: [1,3,5] Output: 1
Example 2:
Input: [2,2,2,0,1] Output: 0
这一题和Find Minimum in Rotated Sorted Array的区别就是输入数组的元素是有重复的。
承接上一题,在考虑num[left]和num[right]的关系时,多了一个等于关系。
1.num[left]>num[right],最小值在左半部分
2.num[left]<num[right],最小值在右半部分
3.num[left]==num[right],跳过这个值,将问题转换为上面两种关系。
class Solution {
public:
int findMin(vector<int>& nums) {
if(nums.size()==0)
return 0;
int n=nums.size();
int left=0;
int right=n-1;
int min_ele=INT_MIN;
while(left<right-1){
if(nums[left]<nums[right])
return nums[left];
int mid=left+(right-left)/2;
if(nums[left]<nums[mid])
left=mid;
else if(nums[left]>nums[mid])
right=mid;
else
left++;
}
return min(nums[left],nums[right]);
}
};