Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置 参考紫书写法

今天是十二月的第一天,每个月的第一天都代表新的开始.哈哈哈:)
纪念11月的打卡情况
在这里插入图片描述
今天遇到了二分查找上下界的一些问题,但是想了想还是没写出来lower_bound和upper_bound的源码.只能再次翻开紫书了~~
代码如下:已经有详细的注释啦!

class Solution {
public:
    int lowerbound(int low,int high,vector<int>& nums,int target){
    //返回target第一次出现的位置 如果不存在,返回这样一个下标i:在此处插入target后序列依然有序
    //查找范围为[low,high) 但是返回的范围是[low,high] 因为如果target大于nums[high-1] 则只能在最后面插入
    /*分析nums[mid]与target的关系
    nums[mid]>target:所求位置不会在mid后面,但可能会是mid 因此high=mid,返回区间为[low,mid]
    nums[mid]==target:已经找到与target相等的值,但是左边可能还会有与target相等的,因此high=mid,返回区间为[low,mid]
    nums[mid]<target:所求的位置不可能在mid和mid左边,因此low=mid+1 返回区间为[mid+1,high]
    */
    while(low<high){
        int mid=(high-low)/2+low;
        if(nums[mid]>=target) high=mid;
        else low=mid+1;
    }
    return low;
    }
    int upperbound(int low,int high,vector<int>& nums,int target){
        //返回target出现的最后一个位置的下一个位置.如果不存在,返回这样一个下标i:在此处插入target后序列依然有序
        //范围与上面同理
        /*分析nums[mid]与target的关系
        nums[mid]>target:所求位置不会再mid后面,但可能会是mid 因此high=mid 返回区间为[low,mid]
        nums[mid]==target:已经找到与target相等的值,但右边可能还会有与target相等的,因此low=mid+1(因为是下一个位置),返回区间为[mid+1,high]
        nums[mid]<target:所求位置不可能为mid和mid左边,因此low=mid+1,返回区间为[mid+1,high]
        */
        while(low<high){
            int mid=(high-low)/2+low;
            if(nums[mid]<=target) low=mid+1;
            else high=mid;
        }
        return low;
    }
    vector<int> searchRange(vector<int>& nums, int target) {
        //二分查找
        int index1=lowerbound(0,nums.size(),nums,target);
        int index2=upperbound(0,nums.size(),nums,target)-1;
        vector<int> res={-1,-1};
        if(index1==index2) return res;
        else{
            res[0]=index1;res[1]=index2-1;
            return res;
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值