第22天(简单题&中等题 二分查找)
打卡第二十二天
1道简单题+3道中等题

题目:

思路:

代码:
class Solution {
public:
bool search(vector<int> &nums, int target) {
int n = nums.size();
if (n == 0) {//数组为空直接返回 false
return false;
}
if (n == 1) {//数组只有一个元素,直接比较是否等于目标值
return nums[0] == target;
}
int l = 0, r = n - 1;//初始化左右指针,开始二分搜索循环
while (l <= r) {
int mid = l + (r - l) / 2;
if (nums[mid] == target) {//如果中点值等于目标值,直接返回 true
return true;
}
if (nums[l] == nums[mid] && nums[mid] == nums[r]) {//当左端点、中点、右端点的值都相等时,无法判断哪边有序,只能同时收缩左右边界
++l;
--r;
} else if (nums[l] <= nums[mid]) {//如果左半部分有序(左端点 <= 中点)
if (nums[l] <= target && target < nums[mid]) {//如果目标值在有序的左半部分范围内,搜索左半部分
r = mid - 1;
} else {//搜索右半部分
l = mid + 1;
}
} else {//右半部分有序
if (nums[mid] < target && target <= nums[n - 1]) {//如果目标值在有序的右半部分范围内,搜索右半部分
l = mid + 1;
} else {//搜索左半部分
r = mid - 1;
}
}
}
return false;//循环结束没找到,返回 false
}
};
三值相等时的处理:通过++l; --r; 来跳过无法判断的情况
耗时≈1.5小时 明天继续

浙公网安备 33010602011771号