力扣704题二分法探讨

start起点为0 无可探讨。
end

左闭右开时,即不考虑nums[end]的值为目标值的时候
选 nums.size() 具体判断条件为 start < end

左闭右闭时,即考虑nums[end]的值为目标值的时候
选 nums.size() - 1 具体判断条件为 start <= end

扩展 当存在多个目标值时

寻找最右边的值

int searchRight(vector<int>& nums, int target) {
    int start = 0;
    int end = nums.size();

    while (start < end) {
        int mid = start + (end - start) / 2;
        if (nums[mid] > target) {
            end = mid; // 目标在mid左侧
        } else { // nums[mid] <= target
            start = mid + 1; // 目标在mid右侧
        }
    }
    // 检查是否找到了目标
    if (start > 0 && nums[start - 1] == target) {
        return start - 1; // 返回最右目标位置
    }
    return -1; // 未找到目标
}

寻找最左边的值

int searchLeft(std::vector<int>& nums, int target) {
    int start = 0;
    int end = nums.size();

    while (start < end) {
        int mid = start + (end - start) / 2;
        if (nums[mid] < target) {
            start = mid + 1; // 目标在mid右侧位置
        } else {
            end = mid; // nums[mid] >= target,目标可能在mid左侧或mid本身
        }
    }

    // 检查是否找到了目标
    if (start < nums.size() && nums[start] == target) {
        return start; // 返回最左目标位置
    }
    return -1; // 未找到目标
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值