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

题目

在这里插入图片描述
LeetCode 34.在排序数组中查找元素的第一个和最后一个位置

代码

class Solution {
    int lower_bound(vector<int>& nums, int target){
        int left = 0, right = nums.size() - 1;
        while(left <= right){
            int mid = left + (right - left) / 2;
            if(nums[mid] >= target) right = mid - 1;
            else left = mid + 1;
        }
        return left;
    }
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int start = lower_bound(nums, target);
        if(start == nums.size() || nums[start] != target) return {-1, -1};
        int end = lower_bound(nums, target + 1) - 1;
        return {start, end};
    }
};

总结

1、采用二分法的找第一个出现的数target为左边界,即nums[mid]>=target的第一个数;最后一个出现的数target为右边界,其实相对于找第一个出现的>=target+1的位置,再减1就是右边界。
2、对于常见四种情况的总结
在这里插入图片描述
关键点1:分割线最终停靠的位置取决于nums[mid] = target时的处理。若令left = mid + 1,分界线最终会停靠在区间最右侧,此时是right刚好指向最右侧(比如最后一个8)(因为最后会进行一次left = mid + 1);若令right = mid - 1,分界线则会停靠在区间最左侧(比如第一个8),同理此时left指向区间最左侧。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值