LeetCode题练习与总结:在排序数组中查找元素的第一个和最后一个位置

一、题目

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

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

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

二、解题思路

1. 查找起始位置

  • 使用二分查找确定目标值是否存在于数组中,并找到其第一次出现的位置。
  • 如果目标值不存在,直接返回 [-1, -1]。
  • 如果目标值存在,记录这个位置作为起始位置。

2. 查找结束位置

  • 由于数组是有序的,我们可以从起始位置开始,向右进行二分查找,但是这次我们寻找的是目标值最后一次出现的位置。
  • 我们需要调整二分查找的逻辑,使其在找到目标值后继续向右查找,直到找不到目标值为止。

三、具体代码

class Solution {public int[] searchRange(int[] nums, int target) {int left = -1, right = -1;int len = nums.length;// 查找起始位置int mid = 0;while (mid < len) {if (nums[mid] == target) {left = mid;break;} else if (nums[mid] < target) {mid += (len - mid) / 2;} else {len = mid;}}// 如果没有找到目标值,直接返回 [-1, -1]if (left == -1) {return new int[]{left, right};}// 查找结束位置right = left;len = nums.length;while (right < len) {int pos = right + (len - right) / 2;if (nums[pos] == target) {right = pos;len = pos;} else {right = pos + 1;}}return new int[]{left, right};}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 时间复杂度是 O(log n)。
  • 查找起始位置的二分查找操作是 O(log n),因为每次迭代都将搜索范围减半。
  • 查找结束位置的二分查找操作同样是 O(log n),原因同上。
  • 两个二分查找操作是独立的,所以总的时间复杂度是 O(log n) + O(log n) = O(log n)。
2. 空间复杂度
  • 空间复杂度是 O(1)。
  • 代码中没有使用额外的数据结构来存储数据,所有的变量都是局部变量,其空间需求与输入数组的大小无关。
  • 因此,空间复杂度是 O(1),即常数空间复杂度。

五、总结知识点

1. 二分查找(Binary Search)

  • 二分查找是一种在有序数组中查找特定元素的高效算法。
  • 它通过将目标值与数组中间元素进行比较,根据比较结果缩小搜索范围,直到找到目标值或搜索范围为空。

2. 循环结构

  • 使用 while 循环来实现二分查找的迭代过程。
  • 循环条件和迭代逻辑是二分查找算法的核心部分。

3. 条件判断

  • 在二分查找过程中,使用 if-else 语句来判断数组中间元素与目标值的关系,从而决定是向左半部分还是向右半部分继续查找。

4. 变量初始化与更新

  • 初始化 leftright 变量为 -1,表示目标值的起始和结束位置未找到。
  • 在查找过程中,根据查找结果更新这些变量的值。

5. 数组操作

  • 使用数组索引来访问和比较数组中的元素。

6. 返回值

  • 返回一个包含两个整数的数组,分别表示目标值的起始和结束位置。
  • 如果目标值不存在于数组中,则返回 [-1, -1]。

7. 边界条件处理

  • 在查找结束位置时,需要特别处理边界条件,确保不会访问数组的无效索引。

8. 算法效率

  • 代码实现了 O(log n) 的时间复杂度,这是二分查找算法的典型时间复杂度。
  • 空间复杂度为 O(1),因为除了输入数组外,没有使用额外的空间。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

第10集《天台教观纲宗》

请大家打开讲义第十七页。我们讲到己二、结申正义。 己二、结申正义 《法华经》把我们修行人修行的相貌&#xff0c;比喻作一个车乘。车乘就是一种交通工具&#xff0c;它能够让我们从此岸超越到彼岸去。所以修行它是可以超越的&#xff0c;你今天比昨天超越了&#xff0c;就好…

【C语言步行梯】C语言实现三子棋游戏(含详细分析)

&#x1f3af;每日努力一点点&#xff0c;技术进步看得见 &#x1f3e0;专栏介绍&#xff1a;【C语言步行梯】专栏用于介绍C语言相关内容&#xff0c;每篇文章将通过图片代码片段网络相关题目的方式编写&#xff0c;欢迎订阅~~ 文章目录 需求分析具体实现主函数体菜单实现游戏实…

速盾:怎么看cdn有没有加速生效?

CDN&#xff08;内容分发网络&#xff09;是一种通过在全球范围内部署服务器节点来提供高速访问内容的技术&#xff0c;可以加速网站的加载速度并提高用户体验。当我们使用CDN服务后&#xff0c;如何判断CDN是否生效成为了一个重要的问题。 要判断CDN是否生效&#xff0c;我们…

基于微信小程序的车位共享平台的设计与实现【附项目源码】分享

基于微信小程序的车位共享平台的设计与实现: 源码地址&#xff1a;https://download.csdn.net/download/qq_41810183/88842865 基于微信小程序的车位共享平台设计与实现需求文档 一、引言 随着城市化进程的加快&#xff0c;停车难问题日益凸显。为解决这一难题&#xff0c;我…

abap opensql 官方文档 abap 整洁之道

abap 整洁之道 https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP_zh.md 支持 in 语法 in &#xff08;’12‘&#xff0c;’34‘&#xff09; SELECT mainquery_clauses[UNION ...]INTO|APPENDING target[UP TO ...] [OFFSET ...][abap_options].... [END…

C#验证哥德巴赫猜想

目录 1.哥德巴赫猜想 2.验证哥德巴赫猜想 1.哥德巴赫猜想 哥德巴赫猜想&#xff08;Goldbach’s Conjecture&#xff09;是数学领域的一个著名猜想&#xff0c;由德国数学家克里斯蒂安哥德巴赫&#xff08;Christian Goldbach&#xff09;在1742年提出。这个猜想的内容是&…

VB+ACCESS学籍管理系统-264-(代码+说明)

转载地址: http://www.3q2008.com/soft/search.asp?keyword264 设计要求&#xff1a; 第一&#xff1a;一篇论文&#xff08;5000到10000字&#xff09;不包括图表和程序代码。A4纸20页之内。 论文结构如下&#xff1a; 设计题目&#xff1a;学籍管理系统 附&#xff1a;程…

KB5034441 0x80070643 reagentc.exe 无法更新引导配置数据

微软2024年1月的更新补丁正常更新会出现0x80070643错误&#xff0c;原因是正常安装系统默认的恢复分区留小了&#xff0c;通过压缩系统盘空间然后在diskgenius扩容恢复分区空间可以解决这个问题&#xff0c;但是笔者在进行上述操作时依旧出现了报错&#xff0c;按照网上的说法可…

高级JAVA工程师解决生产环境JVM宕机Java进程挡掉操作系统内存异常实例讲解

高级JAVA工程师解决生产环境JVM宕机Java进程挡掉内存溢出实例讲解 一、事故描述 生产环境Java进程莫名挡掉&#xff0c;JVM宕机。监控平台报警。生产停了&#xff0c;老板急了&#xff0c;客户爆了&#xff0c;怎么迅速解决事故&#xff1f;每次出现生产事故&#xff0c;都是…

使用公式在Excel中指定列值的变化实现自动间隔着色(不是按照固定的行数)

如果你的文件很小&#xff0c;可以手工着色&#xff1b;但如果很大&#xff0c;就要借助公式来着色&#xff1b; 目的是什么&#xff0c;其中之一是&#xff1a;提升可读性。 一起往下看吧&#xff01;&#xff01; 如果你想要根据Excel某列中值的变化来间隔着色&#xff0c;…

easyrecovery破解版百度云(含Mac/Win版)以及EasyRecovery可以恢复哪些设备

软件介绍 当不小心将回收站的文件删除了怎么办&#xff1f;想找回但是不知道怎么找回需要的数据文件&#xff1f;别担心今天小编就为大家介绍一款非常专业的电脑数据文件恢复工具&#xff0c;easyrecovery14是由Ontrack专为电脑用户推出的一款专业的数据恢复软件&…

景联文科技:提供行业垂直大模型训练数据

近年来&#xff0c;以大模型为代表的人工智能技术已成为国家科技实力竞争的焦点。其中垂直大模型作为重要方向&#xff0c;在相关政策引导及市场需求的驱动下&#xff0c;已展现出较强的发展活力。 行业垂直大模型是针对特定行业的需求和场景进行深度定制的。这意味着模型在训练…

蓝桥杯专题 bfs习题详解

1.离开中山路 #include<iostream> #include<cstring> #include<queue> #include<algorithm> #include<string> using namespace std; int x1,x2,y1,y2; int n,n1,m1; const int N1010;typedef pair<int,int> PII; queue<PII> q;int …

GIS软件应用(二)

任务&#xff1a; 1. 正确划分渔网并裁剪出研究区域 2. 渔网与poi数据正确空间链接并统计网格内类别POI数量 步骤&#xff1a; 将南京市边界进行投影变换&#xff0c;具体看我的这篇文章&#xff1a;GIS软件应用&#xff08;一&#xff09;-CSDN博客 选择ArcToolbox中的 Cr…

海豚调度系列之:集群部署(Cluster)

海豚调度系列之&#xff1a;集群部署Cluster 一、前置准备工作二、准备 DolphinScheduler 启动环境1.配置用户免密及权限2.配置机器 SSH 免密登陆3.启动 zookeeper4.初始化数据库5.修改相关配置5.修改 dolphinscheduler_env.sh 文件 三、启动DolphinScheduler四、登录 DolphinS…

3.Linux/UNIX平台Python的下载、安装和配置环境变量——《跟老吕学Python编程》

3.Linux/UNIX平台Python的下载、安装和配置环境变量——《跟老吕学Python编程》 一、下载Linux/UNIX版Python1.Python官网2.Linux/UNIX版Python下载网址 二、在Linux/UNIX安装Python1.在Ubuntu Linux安装Python1.1 检查Python版本1.2 高级包管理工具1.3 添加存储库1.4 更新软件…

HTML静态网页成品作业(HTML+CSS)——电影肖申克的救赎介绍设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

【Flink SQL】Flink SQL 基础概念:SQL 动态表 连续查询

Flink SQL 基础概念&#xff1a;SQL 动态表 & 连续查询 1.SQL 应用于流处理的思路2.流批处理的异同点及将 SQL 应用于流处理核心解决的问题3.SQL 流处理的输入&#xff1a;输入流映射为 SQL 动态输入表4.SQL 流处理的计算&#xff1a;实时处理底层技术 - SQL 连续查询5.SQL…

Netty架构详解

文章目录 概述整体结构Netty的核心组件逻辑架构BootStrap & ServerBootStrapChannelPipelineFuture、回调和 ChannelHandler选择器、事件和 EventLoopChannelHandler的各种ChannelInitializer类图 Protocol Support 协议支持层Transport Service 传输服务层Core 核心层模块…

Windows C++ 使用WinAPI实现RPC

demo下载地址&#xff1a;https://download.csdn.net/download/2403_83063732/88958730 1、创建IDL文件以及acf文件&#xff08;创建helloworld.idl helloworld.acf&#xff09; 其中IDL文件&#xff1a; import "oaidl.idl"; import "ocidl.idl"; [ …