题目描述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7]
可能变为 [4,5,6,7,0,1,2]
)。
请找出其中最小的元素。
注意数组中可能存在重复的元素。
示例 1:
输入: [1,3,5] 输出: 1
示例 2:
输入: [2,2,2,0,1] 输出: 0
说明:
- 这道题是 寻找旋转排序数组中的最小值 的延伸题目。
- 允许重复会影响算法的时间复杂度吗?会如何影响,为什么?
问题分析
此题先把数组两侧重复的数成对去掉,直到最左端的数大于最右端的数时,用上一题的方法进行二分查找,然后我们把查找出的结果和原数组边缘nums[l]取较小的值返回。
代码实现
class Solution {
public:
int findMin(vector<int>& nums) {
int l = 0;
int r = nums.size() - 1;
while(l < r && nums[l] == nums[r]){
l++;
r--;
}
while(l < r){
int mid = l + r >> 1;
if(nums[mid] > nums[r])
l = mid + 1;
else
r = mid;
}
return min(nums[l], nums[0]);
}
};