第22天(简单题&中等题 二分查找)

打卡第二十二天
1道简单题+3道中等题

image

题目:

image

思路:

image

代码:

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小时 明天继续

posted @ 2025-11-11 22:58  Wy0518  阅读(3)  评论(0)    收藏  举报