解题思路:二分查找
使用二分查找来寻找最小值。
left,right,mid分别代表数组中最左边、中间、最右边的元素。这三个数字在旋转数组中的大小比较总共有三种情况。
1、数组是升序的,即 nums[left] < nums[mid] < nums[right] ;
2、数组是降序的,即 nums[left] > nums[mid] > nums[right] ;
3、nums[mid] 处于前半部分的升序数组中;
4、nums[mid] 处于后半部分的升序数组中。
class Solution {
public:
int findMin(vector<int>& nums) {
if(nums.empty()) return 0;
int n = nums.size();
if(n == 1) return nums[0];
return getMin(nums, 0, n-1);
}
int getMin(vector<int>& nums, int left, int right){
if(left == right-1){
if(nums[left] < nums[right]) return nums[left];
else return nums[right];
}
else{
int mid = (left + right) / 2;
if(nums[left] < nums[mid] && nums[mid] < nums[right]) return nums[left]; //升序
else if(nums[left] > nums[mid] && nums[mid] > nums[right]) return nums[right]; //降序
else if(nums[mid] > nums[left]) return getMin(nums, mid, right); //mid在左边
else return getMin(nums, left, mid); //mid 在右边
}
}
};