LeetCode 153 Find Minimum in Rotated Sorted Array
思路
二分查找,通过left,mid,right指向元素之间的关系改变搜索区间。对于一个递增的序列,有nums[left] < nums[mid] < nums[right],那么,我们考虑不满足递增序列的情况下,该如何改变搜索区间。如果nums[mid] < nums[left],说明最小值在[left, mid]之间,可以将搜索区间更改为[left + 1, mid]。如果nums[mid] > nums[right],说明最小值在[mid, right]之间,可以把区间更改为[mid+1, right]。while循环条件为left < right,也就是当left和right指向同一个元素的时候,退出。有一些题是使用二分查找,找到数组中元素值等于target,这时的退出条件应该是left <= right,因为要检查当left和right指向同一个元素的值是否等于target。
这里的解法一先和left比较,后和right比较。解法二的思路和解法一想通,只不过,是只和right比较。
代码
解法一
class Solution {
public:
int findMin(vector<int>& nums) {
int left = 0, right = nums.size() - 1, mid;
while (left < right) {
mid = left + (right - left) / 2;
if (nums[mid] < nums[left]) {
++left;
right = mid;
}
else if (nums[mid] > nums[right])
left = mid + 1;
else right = mid;
}
return nums[left];
}
};
解法二
class Solution {
public:
int findMin(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] < nums[right]) {
right = mid;
}
else if (nums[mid] > nums[right]) {
left = mid + 1;
}
}
return nums[left];
}
};