leetcode_34. 在排序数组中查找元素的第一个和最后一个位置

文章介绍了如何通过Solution类中的Find_Left_Boundary和Find_Right_Boundary函数,在给定有序整数数组中找到目标值target的左右边界。主要运用了二分查找策略来提高搜索效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Find_Right_Boundary(vector<int>& nums, int target)

  • 目的:找到 target 右侧的边界,即数组中大于 target 的最小索引。
  • 如果 target 大于等于中间值,说明 target 可能在右侧或者就是中间值,移动 left 指针并更新 result 为 left
  • 如果 target 小于中间值,说明 target 在左半部分,移动 right 指针。

Find_Left_Boundary(vector<int>& nums, int target)

  • 目的:找到 target 左侧的边界,即数组中小于 target 的最大索引。
  • 如果 target 大于中间值,说明 target 在右半部分,移动 left 指针。
  • 如果 target 小于等于中间值,移动 right 指针,并更新 result 为 right。这是因为我们试图找到小于 target 的最大索引。
class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int leftBorder = Find_Left_Boundary(nums, target);
        int rightBorder = Find_Right_Boundary(nums, target);
        // 情况一
        if (leftBorder == -2 || rightBorder == -2) return {-1, -1};
        // 情况三
        if (rightBorder - leftBorder > 1) return {leftBorder + 1, rightBorder - 1};
        // 情况二
        return {-1, -1};
    }
private:
    int Find_Left_Boundary(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;
        int result = -2;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (target > nums[mid]) {
                left = mid + 1;
            }else if (target <= nums[mid]){
                right = mid -1;
                result = right;
            }
        }
        return result;
    }
    int Find_Right_Boundary(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;
        int result = -2;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (target >= nums[mid]) {
                left = mid + 1;
                result = left;
            }else if (target < nums[mid]){
                right = mid -1;
            }
        }
        return result;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值