题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个升序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
数组可能包含重复项。
注意:数组内所含元素非负,若数组大小为0,请返回-1。
样例
输入:nums=[2,2,2,0,1]
输出:0
问题分析
此题先把数组两侧重复的数成对去掉,直到最左端的数大于最右端的数时,用上一题的方法进行二分查找,然后我们把查找出的结果和原数组边缘nums[l]取较小的值返回。
代码实现
class Solution {
public:
int findMin(vector<int>& nums) {
if(nums.empty())
return -1;
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]);
}
};