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

在排序数组中查找元素的第一个和最后一个位置(力扣)

一.题目介绍

二.题目解析

使用二分进行查找

2.1处理边界情况

如果数组为空,直接返回 [-1, -1],因为无法找到目标值。

int[] ret = new int[2];
ret[0] = ret[1] = -1;
if (nums.length == 0) return ret;

2.2查找左端点(目标值开始位置)

1.初始化指针:

  • left 指向数组的起始位置(索引 0)。
  • right 指向数组的结束位置(索引 nums.length - 1)。

2.二分查找:

  • 计算中间位置 mid = left + (right - left) / 2 (细节一,不然可能陷入死循环)
  • 如果 nums[mid] < target,说明目标值在右半部分,更新 left = mid + 1。
  • 如果 nums[mid] >= target,说明目标值在左半部分或当前位置就是目标值,更新 right = mid。

 

3.循环退出并判断:

  • 当循环条件是left<right 进行判断,不能是left<=right(细节二,不然可能会陷入死循环)
  • 当 left == right 时,循环结束,此时 left 或 right 指向目标值的第一个位置(如果存在)
  • 如果 nums[right] != target,说明目标值不存在,直接返回 [-1, -1],否则设置ret[ 0 ] = left,保存开始位置。
     

细节一解析:

求中间位置有两种:

mid = left + (right - left) / 2(数组长度是奇数则在中间位置,偶数长度在中间位置偏左)

mid = left + (right - left + 1) / 2(数组长度是奇数则在中间位置,偶数长度在中间位置偏右)

如果使用left + (right - left + 1) / 2可能会陷入死循环

如果剩下两个数字,mid值大于目标值时,需要更新right = mid位置,相当于没移动,循环判断依旧如此,陷入死循环。


细节二解析:

为什么循环判断条件不能是 left <= right?,一张图解释

当left == right时,还要继续进入循环,还是更新right = mid,不移动,如此循环判断,陷入死循环。

视频展示:

在排序数组中查找元素的第一个和最后一个位置(左端点)

 

 2.3查找右端点(目标值结束位置)

 

1.重新初始化指针:

  • left 指向数组的起始位置(索引 0)。
  • right 指向数组的结束位置(索引 nums.length - 1)。

 

2.二分查找:

  • 计算中间位置 mid = left + (right - left + 1) / 2。(细节一,避免陷入死循环)
  • 如果 nums[mid] <= target,说明目标值在右半部分或当前位置就是目标值,更新 left = mid。
  • 如果 nums[mid] > target,说明目标值在左半部分,更新 right = mid - 1。

 

3.循环退出并判断:

  • 当循环条件是left<right 进行判断,不能是left<=right(细节二,不然可能会陷入死循环)
  • 当 left == right 时,循环结束,此时 left 或 right 指向目标值的最后一个位置(如果存在)。
  • 将 ret[1] 设置为 left,即目标值的结束位置。

细节一解析

如果使用left + (right - left ) / 2可能会陷入死循环

如果剩下两个数字,mid值小于等于目标值时,需要更新left= mid位置,相当于没移动,循环判断依旧如此,陷入死循环。


细节二跟求左端点一致。

 视频展示:

在排序数组中查找元素的第一个和最后一个位置(右端点)

 

三.题目源码

class Solution {public int[] searchRange(int[] nums, int target) {//判断边界情况int[]  ret = new int[2];ret[0] = ret [1] = -1;if(nums.length == 0) return ret;//求左端点int left = 0; int right = nums.length - 1;while(left < right){int mid = left + (right - left ) / 2;if(nums[mid] < target) left = mid + 1;else right = mid ;}if(nums[right] != target) return ret;else ret[0] = right;//求右端点left = 0;right = nums.length -1;while(left < right){int mid = left + (right - left + 1) / 2;if(nums[mid] <= target) left = mid;else right = mid - 1;}ret[1] = left;return ret;}
}

相关文章:

在排序数组中查找元素的第一个和最后一个位置(力扣)

一.题目介绍 二.题目解析 使用二分进行查找 2.1处理边界情况 如果数组为空&#xff0c;直接返回 [-1, -1]&#xff0c;因为无法找到目标值。 int[] ret new int[2]; ret[0] ret[1] -1; if (nums.length 0) return ret; 2.2查找左端点&#xff08;目标值开始位置&#…...

Native Memory Tracking 与 RSS的差异问题

一 问题现象 前一段时间用nmt查看jvm进程的栈区占用的内存大小。测试代码如下 public class ThreadOOM {public static void main(String[] args) {int i 1;while (i < 3000) {Thread thread new TestThread();thread.start();System.out.println("thread : "…...

完美世界前端面试题及参考答案

如何设置事件捕获和事件冒泡? 在 JavaScript 中,可以通过addEventListener方法来设置事件捕获和事件冒泡。该方法接收三个参数,第一个参数是事件类型,如click、mousedown等;第二个参数是事件处理函数;第三个参数是一个布尔值,用于指定是否使用事件捕获机制。当这个布尔值…...

知识库管理如何推动企业数字化转型与创新发展的深层次探索

内容概要 在当今数字化转型的大背景下&#xff0c;知识库管理日益显现出其作为企业创新发展的核心驱动力的潜力。这种管理方式不仅仅是对信息的存储与检索&#xff0c;更是一种赋能&#xff0c;以提升决策效率和员工创造力。企业能够通过系统地整合和管理各类知识资源&#xf…...

《DeepSeek 网页/API 性能异常(DeepSeek Web/API Degraded Performance):网络安全日志》

DeepSeek 网页/API 性能异常&#xff08;DeepSeek Web/API Degraded Performance&#xff09;订阅 已识别 - 已识别问题&#xff0c;并且正在实施修复。 1月 29&#xff0c; 2025 - 20&#xff1a;57 CST 更新 - 我们将继续监控任何其他问题。 1月 28&#xff0c; 2025 - 22&am…...

【性能优化专题系列】利用CompletableFuture优化多接口调用场景下的性能

背景说明 在实际的软件开发中&#xff0c;我们经常会遇到需要批量调用接口的场景。例如&#xff0c;电商系统在生成商品详情页时&#xff0c;需要同时调用多个服务接口来获取商品的基本信息、库存信息、价格信息、用户评价等。 传统的依次调用方式存在性能问题 面对上述场景…...

DeepSeek-R1本地部署笔记

文章目录 效果概要下载 ollama终端下载模型【可选】浏览器插件 UIQ: 内存占用高&#xff0c;显存占用不高&#xff0c;正常吗 效果 我的配置如下 E5 2666 V3 AMD 590Gme 可以说是慢的一批了&#xff0c;内存和显卡都太垃圾了&#xff0c;回去用我的新设备再试试 概要 安装…...

鸿蒙开发在onPageShow中数据加载不完整的问题分析与解决

API Version 12 1、onPageShow()作什么的 首先说明下几个前端接口的区别&#xff1a; ArkUI-X的aboutToAppear()接口是一个生命周期接口&#xff0c;用于在页面即将显示之前调用。 在ArkUI-X中&#xff0c;aboutToAppear()接口是一个重要的生命周期接口&#xff0c;它会在页…...

Kadane 算法

Kadane 算法 Kadane 算法用于解决最大子数组和问题,即在一个整数数组中找到具有最大和的连续子数组。此算法基于动态规划思想,在一次遍历过程中完成计算。 动态规划思路 核心在于维护两个变量:currentMax 表示当前子数组的最大和;globalMax 保存迄今为止发现的最大子数组…...

在Ubuntu子系统中基于Nginx部署Typecho

下载部署程序 typecho上传文件到子系统 创建文件夹typecho 在目录/var/www/html中创建一个目录typecho cd /var/www/html mkdir typecho将文件typecho.zip上传至新建的目录下&#xff0c;并解压文件 unzip typecho.zip授权文件夹 sudo chown -R www-data:www-data /var/www…...

C++中常用的十大排序方法之1——冒泡排序

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C中常用的排序方法之——冒泡排序的相关…...

不只是mini-react第二节:实现最简fiber

省流|总结 首先&#xff0c;我们编写JSX文件&#xff0c;并通过Babel等转换工具将其转化为createElement()函数的调用&#xff0c;最终生成虚拟 DOM&#xff08;Vdom&#xff09;格式。举个例子&#xff1a; // 原始 JSX const App <div>hi-mini-react</div>;//…...

python 使用Whisper模型进行语音翻译

目录 一、Whisper 是什么? 二、Whisper 的基本命令行用法 三、代码实践 四、是否保留Token标记 五、翻译长度问题 六、性能分析 一、Whisper 是什么? Whisper 是由 OpenAI 开源的一个自动语音识别(Automatic Speech Recognition, ASR)系统。它的主要特点是: 多语言…...

priority_queue的创建_结构体类型(重载小于运算符)c++

当优先级队列里面存的是一个自定义&#xff08;结构体&#xff09;类型&#xff0c;我们有两种方式&#xff0c;一个是用内置类型的方式&#xff0c;在priority_queue<>里写三个参数&#xff0c;比如int, vector<int>, less<int>&#xff0c;把int改成结构体…...

数据结构实战之线性表(一)

一.线性表的定义和特点 线性表的定义 线性表是一种数据结构&#xff0c;它包含了一系列具有相同特性的数据元素&#xff0c;数据元素之间存在着顺序关系。例如&#xff0c;26个英文字母的字符表 ( (A, B, C, ....., Z) ) 就是一个线性表&#xff0c;其中每个字母就是一个数据…...

Python学习之旅:进阶阶段(七)数据结构-计数器(collections.Counter)

在 Python 编程的进阶学习中,数据处理是一项重要的任务。collections.Counter作为 Python 标准库collections模块中的一员,为我们提供了一种高效且便捷的方式来统计数据出现的次数。接下来,就让我们一起深入了解这个强大的计数器。 一、什么是计数器 collections.Counter本…...

Spring Boot项目如何使用MyBatis实现分页查询及其相关原理

写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油&#xff0c;冲鸭&#x…...

【项目初始化】

项目初始化 使用脚手架创建项目Vite创建项目推荐拓展 使用脚手架创建项目 Vite Vite 是一个现代的前端构建工具&#xff0c;它提供了极速的更新和开发体验&#xff0c;支持多种前端框架&#xff0c;如 Vue、React 等创建项目 pnpm create vuelatest推荐拓展...

LeetCode热题100(八)—— 438.找到字符串中所有字母异位词

LeetCode热题100&#xff08;八&#xff09;—— 438.找到字符串中所有字母异位词 题目描述代码实现思路解析 你好&#xff0c;我是杨十一&#xff0c;一名热爱健身的程序员在Coding的征程中&#xff0c;不断探索与成长LeetCode热题100——刷题记录&#xff08;不定期更新&…...

26.Word:创新产品展示说明会【9】

目录 NO1.2.3​ NO4.5.6.7 NO1.2.3 另存为/F12&#xff1a;考生文件夹点亮显示和隐藏标记选中→插入→表格→文字转化成表格→✔制表符→确定布局→自动调整→设计→随便一种保存至“表格”部件库&#xff1a;选中表格→插入→文档部件→使用“表格”部件库&#xff1a;插入→…...

python 之 zip 和 * 解包操作

文章目录 1. zip 函数语法&#xff1a;示例&#xff1a;特点&#xff1a;应用场景&#xff1a; 2. * 操作符语法&#xff1a;示例&#xff1a;应用场景&#xff1a; 3. zip 和 * 的结合使用示例&#xff1a;转置二维列表 4. zip 和 * 的其他用法示例 1&#xff1a;合并多个列表…...

反向代理模块jmh

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当…...

AI应用部署——streamlit

如何把项目部署到一个具有公网ip地址的服务器上&#xff0c;让他人看到&#xff1f; 可以利用 streamlit 的社区云免费部署 1、生成requirements.txt文件 终端输入pip freeze > requirements.txt即可 requirements.txt里既包括自己安装过的库&#xff0c;也包括这些库的…...

文明的基因:在传承中破茧重生

敦煌莫高窟的壁画历经千年风雨&#xff0c;至今仍在向世界讲述着东方美学的密码。那些斑驳的壁画上&#xff0c;既有北魏时期的天竺梵音&#xff0c;也留存着盛唐气象的长安余韵。文明的基因从未停止生长&#xff0c;就像莫高窟的壁画师们在临摹前朝壁画时&#xff0c;总会在衣…...

全国31省空间权重矩阵(地理相邻空间、公路铁路地理距离空间、经济空间)权重矩阵数据-社科数据

中国31个省份空间权重矩阵-社科数据https://download.csdn.net/download/paofuluolijiang/90028597 https://download.csdn.net/download/paofuluolijiang/90028597 空间权重矩阵是反映个体在空间中依赖关系的矩阵&#xff0c;本数据计算全国31个省三种标准化处理的空间权重矩…...

MySQL数据类型转换应注意什么?

文章目录 1. **隐式转换**2. **显式转换**3. **数据截断**4. **字符集与排序规则**5. **日期和时间转换**6. **数值转换**7. **NULL 处理**8. **性能影响**9. **错误处理**10. **函数选择**示例总结 在 MySQL 中进行数据类型转换时&#xff0c;需要注意以下几个关键点&#xff…...

前端开发之jsencrypt加密解密的使用方法和使用示例

目录 RSA密钥生成选项简介 jsencrypt 使用教程 一、安装 jsencrypt 二、使用 jsencrypt 进行加密和解密 1. 创建密钥对 2. 加密数据 3. 解密数据 三、实际应用示例 加密数据并存储到 localStorage 中&#xff1a; 从 localStorage 中读取加密数据并解密&#xff1a; …...

ESP32和STM32在处理中断方面的区别

为了通俗地讲解ESP32和STM32在处理中断方面的区别&#xff0c;我们可以把它们想象成两个不同的“智能管家”系统&#xff0c;各自负责管理一个家庭&#xff08;即嵌入式项目&#xff09;的各种任务。我们将重点放在如何处理突发事件&#xff08;即中断&#xff09;上。 ESP32 …...

98.1 AI量化开发:长文本AI金融智能体(Qwen-Long)对金融研报大批量处理与智能分析的实战应用

目录 0. 承前1. 简介1.1 通义千问(Qwen-Long)的长文本处理能力 2. 基础功能实现2.1 文件上传2.2 单文件分析2.3 多文件分析 3. 汇总代码&运行3.1 封装的工具函数3.2 主要功能特点3.3 使用示例3.4 首次运行3.5 运行结果展示 4. 注意事项4.1 文件要求4.2 错误处理机制4.3 最佳…...

PPT演示设置:插入音频同步切换播放时长计算

PPT中插入音频&同步切换&放时长计算 一、 插入音频及音频设置二、设置页面切换和音频同步三、播放时长计算 一、 插入音频及音频设置 1.插入音频&#xff1a;点击菜单栏插入-音频-选择PC上的音频&#xff08;已存在的音频&#xff09;或者录制音频&#xff08;现场录制…...