当前位置: 首页 > news >正文

[Java·算法·中等]LeetCode34. 在排序数组中查找元素的第一个和最后一个位置

每天一题,防止痴呆

  • 题目
  • 示例
  • 分析思路1
  • 题解1

👉️ 力扣原文

题目

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

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

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

示例

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

分析思路1

1.使用二分查找算法,找到元素第一次出现的位置。这里可以用一个变量记录当前找到的最小位置,每次找到目标元素时,更新这个变量,继续在左侧查找,直到左侧没有目标元素为止。

2.使用二分查找算法,找到元素最后一次出现的位置。这里可以用一个变量记录当前找到的最大位置,每次找到目标元素时,更新这个变量,继续在右侧查找,直到右侧没有目标元素为止。

为什么findLef中tint mid = left + (right - left) / 2;?
计算机中,整数的表示是有限的,如果两个很大的整数相加,可能会导致结果超出整数类型的表示范围,发生整数溢出。例如,如果 left 和 right 都很大,它们的和可能会超出 int 类型的最大值,导致结果变成负数或者其他的不正确的结果。因此,在计算中间位置时,如果直接采用 (right + left) / 2 的方法来计算中间位置,可能会导致整数溢出的问题。而采用 (right - left) / 2 的方法来计算中间位置,则可以避免这个问题的出现,因为 right 和 left 的差值不会超过 int 类型的表示范围,所以计算结果也不会超出 int 类型的范围。

为什么findRight中int mid = left + (right - left + 1) / 2;?
这是因为在二分查找中,当左右边界相邻时,如果中间位置的计算公式为 int mid = left + (right - left) / 2;,那么会出现死循环的情况。因为此时 left 和 right 都指向同一个位置,而中间位置的计算公式为 (left + right) / 2,会一直得到这个位置,而不会结束循环。
为了避免这种情况,我们可以将计算中间位置的公式修改为 int mid = left + (right - left + 1) / 2;,这样在左右边界相邻时,中间位置会取右边界的位置,从而结束循环。

题解1

class Solution {public int[] searchRange(int[] nums, int target) {int[] result = new int[]{-1, -1};if (nums == null || nums.length == 0) {return result;}int left = 0, right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {result[0] = findLeft(nums, target, left, mid);result[1] = findRight(nums, target, mid, right);break;} else if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return result;}private int findLeft(int[] nums, int target, int left, int right) {while (left < right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {right = mid;} else {left = mid + 1;}}return nums[left] == target ? left : -1;}private int findRight(int[] nums, int target, int left, int right) {while (left < right) {int mid = left + (right - left + 1) / 2;if (nums[mid] == target) {left = mid;} else {right = mid - 1;}}return nums[left] == target ? left : -1;}}

执行结果
在这里插入图片描述

相关文章:

[Java·算法·中等]LeetCode34. 在排序数组中查找元素的第一个和最后一个位置

每天一题&#xff0c;防止痴呆题目示例分析思路1题解1&#x1f449;️ 力扣原文 题目 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1,…...

SAP BTEs的简介及实现

一、认识BTE BTE&#xff08;Business Transaction Event&#xff09;也称之为“业务交易事件”,一般的增强(Tcode:SMOD|CMOD)依旧使用ABAP进行二次开发,然而BTE则提供了RFC调用其它产品的可能(Tcode:FIBF)。BTE的设计思路更加简单&#xff0c;和BADI有点类似。在标准程序中留有…...

如何利用海外主机服务提高网站速度?

网站速度是任何在线业务成功的关键。快速的网站速度可以让用户更快地访问您的网站&#xff0c;增加页面浏览量。对于拥有全球用户的网站而言&#xff0c;选择一个海外主机服务商是提高网站速度的有效方法之一。下面是一些利用海外主机服务(如美国主机、香港主机)提高网站速度的…...

【SpringMVC】 一文掌握 》》》 @RequestMapping注解

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ RequestMapping注解一、SpringMVC环境准备1.相…...

高三应该怎么复习

高三是学生们备战高考的重要一年&#xff0c;正确有序的复习可以有效地提高复习效率&#xff0c;下面是一些高效复习的方法和建议&#xff1a;1. 制定合理的学习计划和目标高三的学生要制定合理的学习计划和目标&#xff0c;适当的计划和目标可以使学习更有针对性和效率。建议根…...

如何通过C++ 将数据写入 Excel 工作表

直观的界面、出色的计算功能和图表工具&#xff0c;使Excel成为了最流行的个人计算机数据处理软件。在独立的数据包含的信息量太少&#xff0c;而过多的数据又难以理清头绪时&#xff0c;制作成表格是数据管理的最有效手段之一。这样不仅可以方便整理数据&#xff0c;还可以方便…...

Kalman Filter in SLAM (6) ——Error-state Kalman Filter (EsKF, 误差状态卡尔曼滤波)

文章目录0.前言1. IMU的误差状态空间方程2. 误差状态观测方程3. 误差状态卡尔曼滤波4. 误差状态卡尔曼滤波方程细节问题0.前言 这里先说一句&#xff1a;什么误差状态卡尔曼&#xff1f;完全就是在扯淡&#xff01; 回想上面我们推导的IMU的误差状态空间方程&#xff0c;其实…...

centos7部署KVM虚拟化

目录 centos7部署KVM虚拟化平台 1、新建一台虚拟机 2、系统内的操作 1、修改主机名 2、挂载镜像光盘 3、ssh优化 4、设置本地yum仓库 5、关闭防火墙&#xff0c;selinux 3、安装KVM 4、设置KVM网络 5、KVM部署与管理 6、使用虚拟系统管理器管理虚拟机 创建存储池 …...

【华为机试真题详解 Python实现】最小施肥机能效【2023 Q1 | 100分】

文章目录 前言题目描述输入描述输出描述示例 1输入:输出:示例 2输入:输出:题目解析参考代码暴力解法二分法前言 《华为机试真题详解》专栏含牛客网华为专栏、华为面经试题、华为OD机试真题。 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可…...

SpringBoot - 什么是跨域?如何解决跨域?

什么是跨域&#xff1f; 在浏览器上当前访问的网站&#xff0c;向另一个网站发送请求&#xff0c;用于获取数据的过程就是跨域请求。 跨域&#xff0c;是浏览器的同源策略决定的&#xff0c;是一个重要的浏览器安全策略&#xff0c;用于限制一个 origin 的文档或者它加载的脚本…...

Astra pro相机使用说明

奥比中光的Astra pro这款相机&#xff0c;目前官网已经搜不到相关信息&#xff0c;应该是停产了。但是很多机器人设备上或者淘宝上还能买到。使用起来经常会出现不同的问题。问题1&#xff1a; 这款相机据网友描述&#xff0c;就是乐视相机LeTMC-520&#xff0c;换了外壳&#…...

扬帆优配|数字经济刮起“东风”,龙头晋级7连板

今日两市共40只涨停股&#xff0c;主要集中于数字经济、6G板块&#xff0c;上一个交易日涨停股为29股&#xff1b;除掉18只ST股及3只一字板新股&#xff0c;共19股涨停。另外&#xff0c;4股封板未遂&#xff0c;整体封板率为83%。 6股封单金额超亿元 从收盘涨停板封单量来看&…...

Day911.DTO和DO为什么要互转 -SpringBoot与K8s云原生微服务实践

DTO和DO为什么要互转 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于DTO和DO为什么要互转的内容。 一、什么是DTO DTO &#xff0c;数据传输对象&#xff0c;全称 &#xff08;Data transfer object&#xff09;&#xff0c;用于网络之间传输通讯的对象模型&#x…...

查找、排序、二叉树的算法,统统记录于此。

文章目录一、查找1. 无序表的顺序查找2. 折半查找3. 分块查找4. 二叉排序树BST5. 哈希表查找二、排序1. 不带哨兵的直接插入排序2. 带哨兵的直接插入排序3. 带哨兵、折半查找的直接插入排序4. 希尔排序5. 冒泡排序6. 快速排序7. 选择排序8. 堆排序9. 归并排序二叉树1. 递归先序…...

如何用Python实现在网页中嵌入YouTube的视频?

要在网页中嵌入YouTube视频&#xff0c;可以使用HTML代码&#xff0c;在Python中使用字符串拼接的方式生成HTML代码。下面是一个示例代码&#xff0c;可以生成嵌入YouTube视频的HTML代码: def embed_youtube_video(video_id, width560, height315): """ 生成嵌…...

Easy Deep Learning——PyTorch中的自动微分

目录 什么是深度学习&#xff1f;它的实现原理是怎么样的呢&#xff1f; 什么是梯度下降&#xff1f;梯度下降是怎么计算出最优解的&#xff1f; 什么是导数&#xff1f;求导对于深度学习来说有何意义&#xff1f; PyTorch 自动微分&#xff08;自动求导&#xff09; 为什么…...

【生物信息】利用ChatGPT解释GO分析中的关于Biological Processes的问题

利用ChatGPT解释GO分析中的一些问题 如何理解GO中的evidence:ISS,这是什么?qualifier:involved_in是什么意思?evidence:TAS是什么?evidence: IBA是什么?evidence: IMP是什么?evidence:IDA是什么?evidence: IEA是什么?GO分析中,evidence: NAS是什么意思?GO分析中…...

2018年MathorCup数学建模C题陆基导弹打击航母的数学建模与算法设计解题全过程文档及程序

2018年第八届MathorCup高校数学建模挑战赛 C题 陆基导弹打击航母的数学建模与算法设计 原题再现&#xff1a; 火箭军是保卫海疆主权的战略力量,导弹是国之利器。保家卫国,匹夫有责。为此,请参赛者认真阅读"陆基反舰导弹打击航母的建模示意图"。(附图 1 )参考图中的…...

打怪升级之CFile类

CFile类 信息源自官方文档&#xff1a;https://learn.microsoft.com/zh-cn/cpp/mfc/reference/cfile-class?viewmsvc-170。 CFile是Microsoft 基础类文件类的基类。它直接提供非缓冲的二进制磁盘输入/输出设备&#xff0c;并直接地通过派生类支持文本文件和内存文件。CFile与…...

[css]通过网站实例学习以最简单的方式构造三元素布局

文章目录二元素布局纵向布局横向布局三元素布局b站直播布局实例左右-下 布局左-上下 布局上下-右 布局方案一方案二后言二元素布局 在学习三元素布局之前&#xff0c;让我们先简单了解一下只有两个元素的布局吧 两个元素的相对关系非常简单&#xff0c;不是上下就是左右 纵向布…...

硕士论文AI率要求15%以下,用嘎嘎降AI一次过的经验

硕士论文AI率要求15%以下&#xff0c;用嘎嘎降AI一次过的经验 答辩前一周&#xff0c;导师突然甩来一句&#xff1a;“学校新规&#xff0c;硕士论文AI率15%以下才能送审。” 我当时心态直接崩了。我那篇三万字的研究生论文&#xff0c;从文献综述到实验方法&#xff0c;全是我…...

ARM A53上跑通1080P实时EIS防抖?手把手教你优化特征点与透视变换(附代码思路)

ARM A53实战&#xff1a;1080P实时EIS防抖的7个关键优化策略 当行车记录仪的镜头在颠簸路面剧烈晃动&#xff0c;或是运动相机在冲浪时被海浪拍打&#xff0c;画面稳定性的价值就凸显出来。传统光学防抖受限于物理结构&#xff0c;而电子防抖(EIS)通过算法补偿成为嵌入式设备的…...

导师推荐!盘点2026年最受欢迎的AI论文工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年AI论文工具全面升级&#xff0c;实测提速超50%&#xff0c;覆盖选题、文献分析、内容生成、降重润色、格式排版等全流程场景&#xff0c;真正帮你高效搞定论文。 一、全流程王者&#xff1a;一站式搞定论文全链路&#xff08;…...

LuatOS扩展库API——【airlbs 】airlbs 定位服务

LuatOS 是物联网终端开发的常用工具&#xff0c;为轻量级嵌入式 Lua 脚本运行框架兼实时系统&#xff0c;基于 Lua 5.3 深度优化&#xff0c;适配 4G-Cat.1、MCU 等物联网终端硬件。其以 Lua 脚本开发&#xff0c;采用协程多任务架构&#xff0c;配套完善开发资源&#xff0c;含…...

YOLOv5 vs YOLOv8:2024年工业部署选型指南(附实测对比)

YOLOv5 vs YOLOv8&#xff1a;2024年工业部署选型指南&#xff08;附实测对比&#xff09; 在工业视觉检测领域&#xff0c;目标检测模型的选型直接关系到产线良率、运维成本和系统响应速度。作为YOLO系列当前最成熟的工业级解决方案&#xff0c;YOLOv5和YOLOv8的抉择让不少工程…...

Amazon Corretto 17全链路优化指南:从底层原理到企业级实践

Amazon Corretto 17全链路优化指南&#xff1a;从底层原理到企业级实践 【免费下载链接】corretto-17 Amazon Corretto 17 is a no-cost, multi-platform, production-ready distribution of OpenJDK 17 项目地址: https://gitcode.com/gh_mirrors/co/corretto-17 Amazo…...

基于Dify和RAG技术的AI智能客服准确率优化实战

在构建基于Dify的AI智能客服时&#xff0c;我们常常会遇到一个核心挑战&#xff1a;模型给出的回答听起来头头是道&#xff0c;但仔细一核对&#xff0c;却发现它“一本正经地胡说八道”。例如&#xff0c;在一个医疗健康咨询场景中&#xff0c;用户询问“布洛芬和头孢可以一起…...

5分钟搞定OpenClaw飞书接入:Qwen3.5-9B对话机器人配置

5分钟搞定OpenClaw飞书接入&#xff1a;Qwen3.5-9B对话机器人配置 1. 为什么选择OpenClaw飞书Qwen3.5-9B组合 上周我在整理团队周报时&#xff0c;突然意识到一个痛点&#xff1a;每次都要反复切换浏览器、文档和聊天工具&#xff0c;手动复制粘贴信息。这种机械操作不仅浪费…...

vLLM-v0.17.1GPU算力适配:华为昇腾CANN 7.0与vLLM对接可行性验证

vLLM-v0.17.1 GPU算力适配&#xff1a;华为昇腾CANN 7.0与vLLM对接可行性验证 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库&#xff0c;由加州大学伯克利分校的天空计算实验室(Sky Computing Lab)最初开发&#xff0c;现已发展成为学术界和工业…...

System Verilog实战解析——always_comb中的阻塞赋值与电路行为建模

1. always_comb基础概念与特性 always_comb是SystemVerilog中专门用于描述组合逻辑电路的关键字。与传统的always块不同&#xff0c;它不需要显式指定敏感列表&#xff0c;编译器会自动推导所有读取的信号作为敏感列表。我在实际项目中发现&#xff0c;这个特性可以避免手动维护…...