leetcode 二分查找·系统掌握 在排序数组中查找元素的第一个和最后一个位置

题目:

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

题解:

时间复杂度为O(log n)的查找可以用二分查找实现。一个可行的解决方法是首先通过~01~二分查找出第一个大于等于target的值,判断该值是否等于target,如果不等,返回{-1,-1},如果等于将第二次查找左区间端点设为第一次查找的target的下标接着用~10~二分查找最后一个小于等于该数的值的位置的位置。

vector<int> searchRange(vector<int>& nums, int target) {
        vector<int>ans={-1,-1};
        if(nums.empty())return ans;
        int l=0,r=nums.size()-1,mid;
        while(l<r){
            mid=(l+r)>>1;
            if(nums[mid]>=target)r=mid;
            else l=mid+1;
        }
        if(nums[l]!=target){
            return ans;
        }
        ans[0]=l;
        l=l,r=nums.size()-1;
        while(l<r){
            mid=(l+r+1)>>1;
            if(nums[mid]>target)r=mid-1;
            else l=mid;
        }
        ans[1]=l;
        return ans;
    }

题后反思:

在做该题时出现的错误:

1.Char 9: runtime error: reference binding to null pointer of type 'int' (stl_vector.h)

这个错误提示是因为在leetcode中,你尝试访问一个空指针(null pointer)的整型值。为了解决这个问题,你需要检查你的代码,确保在访问vector的元素之前,vector已经被正确初始化并分配了内存空间。

没考虑到传入数组为空的时候会r=nums.size()-1会产生下标越界。

2.Char 34: runtime error: addition of unsigned offset to 0x5020000003b0 overflowed to 0x501fe9200930 (stl_vector.h)

这个错误提示是因为在leetcode中,你尝试将一个无符号整数(unsigned int)与一个偏移量相加,但是结果超出了该类型的范围,导致了溢出。为了解决这个问题,你需要检查你的代码,确保在进行加法操作时,不会发生溢出。如果需要使用更大的数据类型来存储结果,可以考虑使用long long等类型。

报错原因是使用了未赋值的mid,但是根本原因是因为,没有了解到mid在普通二分查找和泛型二分~01~,~10~查找中的作用,在普通二分查找中,mid是二分查找最后的结果,而在泛型二分中,最终的结果并不存在于mid中而在l或者r中,而mid只是用于在泛型二分中调整r和l的值。

3.在二分查找时超时:

原因是没有清晰的理解普通二分和泛型二分的while循环的写法:

普通二分while(l<=r)

泛型二分while(l<r)

这个等号至关重要,泛型二分不能有等号。

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值