Find Minimum in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
Find the minimum element.
You may assume no duplicate exists in the array.
此题是二分查找的变形,关键还是在于理解二分查找的思想,找到位置变化的条件。
开始low和high分别指向数组的首尾,容易得出当nums[low] < nums[high]时,nums[low]就是最小数。
三种情况:
nums[mid] = 6, nums[mid] > nums[low], 此时最小数在右侧
4 5 6 0 1
nums[mid] = 1, nums[mid] < nums[low],此时最小数在左侧
4 0 1 2 3
nums[mid] = 0, nums[mid] < nums[low],此时nums[mid]就是最小数
4 5 0 1 2
于是得出:
int mid = (low + high) / 2;
if (nums[mid] < nums[low]) {
high = mid - 1;
} else {
low = mid + 1;
}
但是第三种情况例外,一种方式是特殊处理,更好的是改变比较顺序,并且nums[low]是最终结果,可得:
if (nums[mid] >= nums[low]) {
low = mid + 1;
} else {
high = mid;
}
所有代码如下:
int findMin(vector<int>& nums) {
int low = 0;
int high = nums.size() - 1;
while (low < high) {
if (nums[low] < nums[high]) {
break;
}
int mid = (low + high) / 2;
if (nums[mid] >= nums[low]) {
low = mid + 1;
} else {
high = mid;
}
}
return nums[low];
}