题目描述
把一个数组最开始的若干个数字搬到数组的末尾,称之为数组的旋转。输入一个递增排序的数组的一个旋转,
输出旋转数组的最小元素。
例如,数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1
思路
二分查找
class Solution {
public:
int findMin(vector<int>& nums) {
if(nums.empty())
return -1;
int left = 0, right = nums.size()-1;
int mid = left;
while(nums[left] >= nums[right]){
if(right - left == 1){
mid = right;
break;
}
int mid = (left + right) >> 1;
//如果下标为left、right和mid指向的三个数字相等,则只能顺序查找
if(nums[mid] == nums[left] && nums[left] == nums[right])
return find(nums, left, right);
if(nums[mid] >= nums[left])
left = mid;
else if(nums[mid] <= nums[right])
right = mid;
}
return nums[mid];
}
int find(vector<int>& nums, int left, int right){
int min_num = nums[left];
for(int i = left + 1; i < right; ++i){
min_num = min(min_num, nums[i]);
}
return min_num;
}
};