跟着Carl大佬学leetcode之34 在排序数组中查找元素的第一个和最后一个位置

news2024/12/23 22:56:38

来点强调,刷题是按照代码随想录的顺序进行的,链接如下https://www.programmercarl.com/本系列是记录一些刷题心得和学习过程,就看到题目自己先上手试试,然后看程序员Carl大佬的解释,自己再敲一遍修修补补,练题的小伙伴还是跟着大佬的解释比较系统

文章目录

  • 每日碎碎念
  • 一、题目要求及测试点
    • 34 在排序数组中查找元素的第一个和最后一个位置
    • 测试点
    • 提示
  • 二、题解
    • 自己上手
    • 正经题解
      • 二分法的变形用法
  • 三、总结


每日碎碎念

苦痛生活继续
hello LeetCode,今天还是数组二分专项刷题…话说昨天amazing接到春招第一个面试竟然是卷烟厂,虽然13进2概率低的怕人,但还是准备下吧,总比待业强,暴风哭泣


一、题目要求及测试点

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

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

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

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
链接https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/description/

测试点

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

示例 2:

输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]

示例3:

输入:nums = [], target = 0
输出:[-1,-1]

提示

  • 0 < = n u m s . l e n g t h < = 1 0 5 0 <= nums.length <= 10^5 0<=nums.length<=105
  • − 1 0 9 -10^9 109 <= nums[i] <= 1 0 9 10^9 109
  • nums 是一个非递减数组
  • − 1 0 9 -10^9 109 <= target <= 1 0 9 10^9 109

二、题解

自己上手

代码如下:

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) { 
        int left = 0; 
        int right = nums.size() - 1; 
        int leftborder = -1;
        int rightborder = -1; 
        if (right == 0 && target != nums[right])
            return {leftborder, rightborder}; 
        while (left <= right){ 
            int middle = left + ((right - left) >> 1); 
            if (target < nums[middle])
                right =  middle - 1; 
            else if (target > nums[middle])
                left =  middle + 1; 
            else { 
                leftborder = middle; 
                rightborder = middle; 
                if (leftborder == 0)
                    leftborder--; 
                else{ 
                    while (leftborder >=0 && nums[leftborder] == target)
                        leftborder--; 
                }
                if (rightborder == nums.size() - 1)
                    rightborder++; 
                else{ 
                    while (rightborder <= nums.size() - 1 && nums[rightborder] == target)
                        rightborder++; 
                }
                return {leftborder + 1, rightborder - 1}; 
            }
        }
        return {leftborder, rightborder}; 
    }
};

在这里插入图片描述

来点无用总结:
时间复杂度O(nlogn),框架仍然是二分,最开始初始化了个左边界和右边界[-1,-1],把一个元素且不等于target拎出来解决了下,之后二分找元素,对找到后的情况再细分,左边界右边界初始化为middle,然后分别向左遍历,向右遍历,注意里面数组边界问题

正经题解

寻找target在数组里的左右边界,有如下三种情况:

情况一:target 在数组范围的右边或者左边,返回{-1, -1}
情况二:target 在数组范围中,且数组中不存在target,同样返回{-1, -1}
情况三:target 在数组范围中,且数组中存在target

下面题解中将情况一、二合并了一下,在寻找左、右边界中对于是否成功搜索加了个success检验,如果没搜索到就把flag归为初始值

二分法的变形用法

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) { 
        int rangel = findLeftRange(nums, target); 
        int ranger = findReftRange(nums, target); 
        if (rangel == -2 || ranger == -2)
            return {-1, -1}; 
        else { 
            return {rangel + 1, ranger - 1};
        }
    }

private: 
    int findLeftRange(vector<int>& nums, int target){ 
        int left = 0; 
        int right = nums.size() - 1; 
        int flagl = -2;
        int success = 0; 
        while (left <= right){ 
            int middle = left + ((right - left) >> 1);
            if (target == nums[middle])
                success = 1;
            if (target <= nums[middle]){ 
                right = middle - 1; 
                flagl = right; 
            }
            else { 
                left = middle + 1; 
            }
        }
        if (success == 0)
            flagl = -2; 
        return flagl;
    }
    int findReftRange(vector<int>& nums, int target){ 
        int left = 0; 
        int right = nums.size() - 1; 
        int flagr = -2;
        int success = 0; 
        while (left <= right){ 
            int middle = left + ((right - left) >> 1);
            if (target == nums[middle])
                success = 1;
            if (target < nums[middle]){ 
                right = middle - 1; 
            }
            else { 
                left = middle + 1; 
                flagr = left; 
            }
        }
        if (success == 0)
            flagr = -2;
        return flagr;
    }
};

在这里插入图片描述

时间复杂度:O(log n),需要强调的是,在二分框架上改动后,可以用来找连续出现元素的长度,子程序部分可通过下图理解(以寻找右边界为例),找哪个边界就找哪段区间的多一格
在这里插入图片描述


三、总结

1.注意二分法变形使用,把对于target和n[middle]的比较情况划分为两种,对于寻找边界的那个子区间保留边界值;
2.理清逻辑!!!
3.如果不加关于success的判断,对于情况二,可用Rb-Lb>1来判断,因为如果搜索不到两者之差是==1的;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1581088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯每日一题:有序分数(递归)

给定一个整数 N&#xff0c;请你求出所有分母小于或等于 N&#xff0c;大小在 [0,1] 范围内的最简分数&#xff0c;并按从小到大顺序依次输出。 例如&#xff0c;当 N5 时&#xff0c;所有满足条件的分数按顺序依次为&#xff1a; 0/1,1/5,1/4,1/3,2/5,12/,35,2/3,3/4,4/5,1/…

SpringBoot通用模块--文件上传开发(阿里云OSS)

文件上传&#xff0c;是指将本地图片、视频、音频等文件上传到服务器上&#xff0c;可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛&#xff0c;我们经常发抖音、发朋友圈都用到了文件上传功能。 实现文件上传服务&#xff0c;需要有存储的支持&#xff0c;那…

850. Dijkstra求最短路 II

850. Dijkstra求最短路 II 代码&#xff1a; #include<algorithm> #include<iostream> #include<cstring> #include<queue> #include<cmath>using namespace std; //用pair存储编号和距离 typedef pair<int,int> PII;int n,m; const int …

FL Studio21水果软件有哪些新功能?如何下载破解版

FL Studio 21是一款由Image-Line公司开发的专业的音乐制作软件&#xff0c;它提供了音乐编曲、录音、编辑、混音等多种功能&#xff0c;非常适合专业音乐制作人、DJ及音乐爱好者使用。这款软件不仅具有高级的音频编辑功能&#xff0c;如切片、时间伸缩、音高调整&#xff0c;还…

Python空间分析简明教程

数据世界是一个活生生的、会呼吸的事物。 当一个城市的犯罪率上升时&#xff0c;这是因为现实世界中有人在某个地方犯罪。 有警察局、住宅区和商业区、人口密度以及可以与位置相关联的人的地方。 所有这些东西都存在于数据框和表格之外的世界中。 空间分析使数据科学家能够回答…

java jdbc的使用及实践

文章目录 介绍背景发展目的和设计演进结论 JDBC的主要组件JDBC使用流程JDBC的事务管理JDBC驱动类型结论 insert和batch insert示例&#xff1a; update和batch update事务的重要性 delete和batch delete单条记录删除&#xff08;Delete&#xff09;批量删除多条记录&#xff08…

电脑打开游戏的时候提示缺少.dll文件?照着这个来就行。

前言 小白曾经也是一个很喜欢玩游戏的人&#xff0c;但那只是曾经。那时候宿舍里一共6个人&#xff0c;都是比较喜欢玩游戏的小伙子。 话题好像偏了…… 有些小伙伴下载玩游戏之后&#xff0c;高高兴兴地想要开始玩。结果游戏根本没办法运行&#xff0c;可恶&#xff01;这该…

Fecify 商品标签功能

关于商品标签 商品标签是指商家可以在展示商品时&#xff0c;自己创建一个自定义标签&#xff0c;可自定义某个关键词或短语。这样顾客在浏览商城时&#xff0c;只需要通过标签就能看到更直观的展示信息。 商品标签可以按照用户的属性、行为、偏好等进行分类&#xff0c;标签要…

基于Java+SpringBoot+Vue美容院业务管理系统(源码+文档+部署+讲解)

一.系统概述 悦己美容院后台管理系统的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓&#xff0c;iOS相比…

数据结构DAY4--哈希表

哈希表 概念&#xff1a;相当于字典&#xff0c;可以根据数据的关键字来寻找相关数据的查找表。 步骤&#xff1a;建立->插入->遍历->查找->销毁 建立 建立数据&#xff0c;形式随意&#xff0c;但一般为结构体&#xff08;储存的数据量大&#xff09;&#xff…

apply call bind的使用区别

bind(this对象&#xff0c;arg1&#xff0c;arg2。。。) &#xff0c;第二个参数为参数列表 用于改变this指向&#xff1b;调用会返回一个新的改变了this指向的函数&#xff0c;并不会立即执行而是需要调用新的函数&#xff1b;可以进行部分传参&#xff1b;如果是箭头函数无法…

TCP-IP详解卷一:协议——阅读总结

该内容适合程序员查看 第1章 概述 1.1 引言 WAN全称是 Wide Area Network&#xff0c;中文名为广域网。 LAN全称是 Local Area Network&#xff0c;中文名为局域网。 1.2分层 ICP/IP协议族通常被认为是一个四层协议系统 分层协议应用层Telnet、FTP和e-mail运输层TCP和UDP网…

编程新手必看,学习python中字典数据类型内容(11)

介绍&#xff1a; Python3中的字典是一个非常重要的内置数据结构&#xff0c;它以键值对的形式存储数据&#xff0c;允许通过键来快速访问相应的值。 字典的特点和操作如下&#xff1a; 创建字典&#xff1a;可以通过一对大括号{}来创建一个空字典&#xff0c;或者在大括号内部…

计算机考研择校|408还是自命题,哪个上岸难度大?

我一般是建议选择408&#xff0c;但是现在考408的同学太多了 所以408的竞争压力会比较大&#xff0c;加上复习难度大&#xff0c;复习过程中&#xff0c;心态很容易崩掉。 其实到底选自命题还是408&#xff0c;我觉得还是要看自己的目标。如果目标院校是自命题&#xff0c;那…

linux自动下载rpm的依赖包的方法

背景 rpm安装包是存在依赖关系的。通常在离线安装的时候&#xff0c;没有下全依赖包&#xff0c;安装就会失败。 分析 1.首先我们要使用yumdownloader来下载指定的包。 yumdownloader --disablerepo* --enablerepobase,epel,extras --releasever7 --archx86_64 --downloadd…

人工智能——机器学习概述

1. 人工智能 1.1. 概念 人工智能(Artificial Intelligence&#xff0c;AI)&#xff0c;是新一轮科技革命和产业变革的重要驱动力量&#xff0c; [26]是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 人工智能是智能学科重要的组…

搭建前后端的链接(java)

搭建前后端的链接(java) 一.前提 1.1 javaEE 搭建前后端的链接首先需要用到javaEE&#xff0c;也就是java企业版&#xff0c;也就是java后端(后端javaSE) 利用javaEE和前端交互&#xff0c;javaSE和数据库交互&#xff0c;javaSE和javaEE之间再进行交互就实现了前后端的交互…

open graph简述

场景 在我们使用twitter的时候&#xff0c;会发现有的链接会显示预览卡片&#xff0c;有的不会。 这是因为有的网站设置了open graph&#xff0c;有的没有。 那么什么是open graph&#xff1f; open graph是一个由facebook在2010年发布的协议&#xff0c;用于在社交网络上分享…

每日OJ题_两个数组dp⑤_力扣10. 正则表达式匹配

目录 力扣10. 正则表达式匹配 解析代码 力扣10. 正则表达式匹配 10. 正则表达式匹配 难度 困难 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c…

A Learning-Based Approach for IP Geolocation

下载地址:Towards IP geolocation using delay and topology measurements | Proceedings of the 6th ACM SIGCOMM conference on Internet measurement 被引次数:185 Abstract 定位IP主机地理位置的能力对于在线广告和网络攻击诊断等应用程序是非常吸引力的。虽然先前的方…