栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

二分法查找的升级版 力扣34

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

二分法查找的升级版 力扣34

题目:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这个题刚开始我是按照正常的二分查找找出一个与target相等的数组下标,然后左右移动这个下标直至target与其值不相等,但是超时了,评论区有大佬说最坏的情况(即所有的数都是target)的时间复杂度是O(n)。
这个做法我是借鉴了评论区代码随想录的思路。
我觉得这个题有两个难点,第一个是要能想到找右边界的时候 nums[mid]=target时,left还是要等于mid+1,这样才能找到第一个大于target的值,左边界同理。第二个就是要给左右边界赋一个初值(数组下标到不到的),这样才能知道左右边界是否被改变了。

在这里插入代码片
```class Solution {
public:
    vector searchRange(vector& nums, int target) {
        int LeftBorder=getLeftBorder(nums, target);
        int RightBorder=getRightBorder(nums, target);
        if(LeftBorder==-2||RightBorder==-2)  //target太大或太小,超出数组范围
            return {-1,-1};
        if(RightBorder-LeftBorder>1)   //有target值
            return {LeftBorder+1,RightBorder-1};
        return {-1,-1};  //没有target值
    }

private:
    int getRightBorder(vector& nums,int target){  //寻找右边界
        int l=0;
        int r=nums.size()-1;
        int RightBorder=-2;   //记录一下其值,可分辨出它是否被赋值了
        while(l<=r){
            int mid=l+(r-l)/2;
            if(nums[mid]>target)
                r=mid-1;
            else{
                l=mid+1;
                RightBorder=l;  //右边第一个不是target的
            }
        }
        return RightBorder;
    }
    int getLeftBorder(vector& nums,int target){  //寻找左边界
        int l=0;
        int r=nums.size()-1;
        int LeftBorder=-2;
        while(l<=r){
            int mid=l+(r-l)/2;
            if(nums[mid]
                r=mid-1;
                LeftBorder=r;  //左边第一个不是target的
            }
        }
        return LeftBorder;
    }
}; 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/950340.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号