【Hot 100】34. 在排序数组中查找元素的第一个和最后一个位置

请添加图片描述

  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:算法专栏
  • 💥 标题:【Hot 100】34. 在排序数组中查找元素的第一个和最后一个位置
  • ❣️ 寄语:书到用时方恨少,事非经过不知难!

引言

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

  • 🎈 题目链接:
  • 🎈 做题状态:

我的解题

关于二分查找判断条件修改,可以定位目标值左右边界的讲解,在【Hot 100】二分查找(单个目标值:查找目标值、多个目标值:查找目标值左右边界)文章中有详细的说明。可以参考那篇文章。


class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        if (nums.size() == 0) return {-1, -1};

        // 用二分法找出第一个比target小的,然后找出第一个比target大的元素索引。
        int left = 0;
        int right = nums.size() - 1;

        while(left <= right)
        {
            int mid = (right - left) / 2 + left;
            if (nums[mid] <= target)   
            {
                // 小于等于目标值,移动左边界
                left = mid + 1;
            } else if (nums[mid] > target)
            {
                // 大于目标值
                right = mid - 1;
            }
        }

        // 此时right指向的是右边界
        int rBound = right;

        left = 0;
        right = nums.size() - 1;
        while(left <= right)
        {
            int mid = (right - left) / 2 + left;
            if (nums[mid] < target)   
            {
                // 小于目标值
                left = mid + 1;
            } else if (nums[mid] >= target) 
            {
                // 大于等于目标值
                right = mid - 1;
            }
        }
        // 此时 left 指向的是左边界
        int lBound = left;

        // 如果两个边界相减小于等于1,则说明没有目标值
        if (rBound - lBound < 0) return {-1, -1};

        return {lBound, rBound};
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值