LeetCode 81 Search in Rotated Sorted Array II
思路
二分查找。当nums[left] == nums[mid] && nums[right] == num[right]时,是无法确认下一步应该如何调整查找区间的,此时调整边界即可。此时有两种方案:
-
同时检查两个边界,nums[left] == nums[mid] && nums[mid] == nums[right]成立时,修改左右边界。
-
只检查一个边界,nums[left] == nums[mid]成立时,修改左边界。nums[left] == nums[mid] && nums[mid] == nums[right]同样不能成立,因为我们保证了nums[left] == nums[mid]一直为假。
nums[mid]是否等于target需要在nums[left] == nums[mid] && nums[right] == num[right]之前检查。如果在之后检查,在nums[left] == nums[mid] && nums[right] == num[right] && nums[mid] == target为true的情况下,将答案错过。也说明了,当mid指向的元素不等于target的时候,才考虑如何调整搜索区间。
代码
检查两个边界
class Solution {
public:
bool search(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1, mid;
while (left <= right) {
mid = left + (right - left) / 2;
if (nums[mid] == target) return true;
if (nums[left] == nums[mid] && nums[mid] == nums[right]) {
--right;
++left;
continue;
}
if (nums[left] <= nums[mid]) {
if (nums[left] <= target && target < nums[mid])
right = mid - 1;
else left = mid + 1;
}
else {
if (target > nums[mid] && target <= nums[right])
left = mid + 1;
else right = mid - 1;
}
}
return false;
}
};
检查一个边界
class Solution {
public:
bool search(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1, mid;
while (left <= right) {
mid = left + (right - left) / 2;
if (nums[mid] == target) return true;
if (nums[left] == nums[mid]) {
++left;
continue;
}
if (nums[left] <= nums[mid]) {
if (nums[left] <= target && target < nums[mid])
right = mid - 1;
else left = mid + 1;
}
else {
if (target > nums[mid] && target <= nums[right])
left = mid + 1;
else right = mid - 1;
}
}
return false;
}
};