题目1
解析旋转数组
由于该数组是升序排序,经过旋转后,最小值右边的数严格大于最小值,最大值左边的数严格小于最大值。
那么可以用二分查找的方法来解决这道题目,因为可以确定最小值一定在low和high之间,然后通过更新pivot来减小搜索区域。基本上会出现两种情况。
- nums[pivot]小于nums[high],这说明了nums[pivot]是最小值右边的数
- nums[pivot]大于nums[high],这说明来nums[pivot]是最小值左边的数。
由于该数组不包含重复的元素,那么可以把nums[pivot] == nums[high]的情况不考虑
拿leetcode的题解图来用
class Solution {
//二分查找
//通常来讲,二分查找是用在有顺序的数据排列去查找,但是对于旋转数组,也可以使用
public:
int findMin(vector<int>& nums) {
int low = 0;
int high = nums.size()-1;
while(low < high){
int mid = low + (high-low)/ 2;
if(nums[mid] < nums[high]){
high = mid;
}
else{
low = mid+1;//注意一定要+1
}
}
return nums[low];
}
};
那么当出现了nums[high] == nums[pivot]的情况怎么办,直接递减high就好,因为出现nums[high] == nums[pivot]的情况只有较大元素经过旋转后,部分仍然留在后面,也就是说,最小值在它们之间。
class Solution {
//二分查找
//通常来讲,二分查找是用在有顺序的数据排列去查找,但是对于旋转数组,也可以使用
public:
int findMin(vector<int>& nums) {
int low = 0;
int high = nums.size()-1;
while(low < high){
int mid = low + (high-low)/ 2;
if(nums[mid] < nums[high]){
high = mid;
}
else if(nums[mid] > nums[high]){
low = mid+1;
}
else{
high--;
}
}
return nums[low];
}
};