LeetCode 153. 寻找旋转排序数组中的最小值:二分查找法详解及高频疑问解析
文章目录
- 问题描述
- 算法思路:二分查找法
- 关键步骤
- 代码实现
- 代码解释
- 高频疑问解答
- 1. 为什么循环条件是 `left < right` 而不是 `left <= right`?
- 2. 为什么比较 `nums[mid] > nums[right]` 而不是 `nums[left] <= nums[mid]`?
- 3. 为什么 `right = mid` 而不是 `right = mid - 1`?
- 总结
问题描述
已知一个长度为 n
的旋转排序数组(例如原数组 [0,1,2,4,5,6,7]
旋转后可能变为 [4,5,6,7,0,1,2]
),要求以 O(log n)
的时间复杂度找到数组中的最小值。
算法思路:二分查找法
旋转排序数组的特点是部分有序,可以通过二分查找法快速定位最小值。核心思路是通过比较中间元素与右边界元素,逐步缩小搜索范围。
关键步骤
- 初始化指针:左指针
left = 0
,右指针right = nums.length - 1
。 - 循环条件:当
left < right
时继续循环。 - 计算中间位置:
mid = left + (right - left) / 2
(避免整数溢出)。 - 比较与调整指针:
- 若
nums[mid] > nums[right]
,说明最小值在右半段,调整左指针left = mid + 1
。 - 否则,最小值在左半段或当前
mid
位置,调整右指针right = mid
。
- 若
- 终止条件:当
left == right
时,找到最小值。
代码实现
class Solution {public int findMin(int[] nums) {int left = 0;int right = nums.length - 1;while (left < right) {int mid = left + (right - left) / 2;if (nums[mid] > nums[right]) {left = mid + 1;} else {right = mid;}}return nums[left];}
}
代码解释
代码片段 | 说明 |
---|---|
int left = 0 | 初始化左指针指向数组起始位置。 |
int right = nums.length - 1 | 初始化右指针指向数组末尾位置。 |
mid = left + (right - left) / 2 | 计算中间位置,避免直接相加导致的整数溢出。 |
nums[mid] > nums[right] | 比较中间元素与右边界元素,决定搜索方向。 |
left = mid + 1 | 中间元素大于右边界,最小值在右侧,左指针右移。 |
right = mid | 中间元素小于等于右边界,最小值在左侧或当前 mid 位置,右指针左移。 |
return nums[left] | 循环结束时 left 和 right 重合,指向最小值。 |
高频疑问解答
1. 为什么循环条件是 left < right
而不是 left <= right
?
- 核心逻辑:当
left == right
时,已经锁定唯一可能的最小值位置,无需继续循环。 - 示例分析:
- 若数组只有一个元素(如
[3]
),直接返回nums[0]
。 - 若数组未旋转(如
[1,2,3,4]
),最终left
和right
会收敛到0
。
- 若数组只有一个元素(如
- 风险提示:若使用
left <= right
,当left == right
时,循环内会计算一次mid = left
,但此时已找到结果,多余的循环可能引发逻辑错误。
2. 为什么比较 nums[mid] > nums[right]
而不是 nums[left] <= nums[mid]
?
- 核心逻辑:旋转数组的最小值一定在“右半段”或“左半段”的分界点,直接比较中间元素和右边界可精准定位方向。
- 示例分析:
- 情况1:
nums[mid] > nums[right]
(如[4,5,6,1,2]
中mid=6
,right=2
),说明最小值在右半段。 - 情况2:
nums[mid] <= nums[right]
(如[5,1,2,3,4]
中mid=2
,right=4
),说明最小值在左半段或mid
处。
- 情况1:
- 对比策略:若比较
nums[left] <= nums[mid]
,可能误判无序区间(如[3,1,2]
中mid=1
时,nums[left]=3 <= nums[mid]=1
不成立)。
3. 为什么 right = mid
而不是 right = mid - 1
?
- 核心逻辑:当
nums[mid] <= nums[right]
时,mid
可能是最小值,不能跳过。 - 示例分析:
- 正确示例:
[4,5,1,2,3]
中mid=1
,nums[mid]=1
是实际最小值,若right = mid-1
会跳过正确值。 - 错误风险:在
[3,1,2]
中若right = mid-1
,mid=1
时right
变为0
,导致返回错误值nums[0]=3
。
- 正确示例:
总结
- 时间复杂度:二分查找法的时间复杂度为
O(log n)
,空间复杂度为O(1)
。 - 适用场景:适用于所有旋转排序数组(包括未旋转的情况)。
- 关键点:通过比较中间元素与右边界元素,确保每次循环将搜索区间缩小一半。
- 注意事项:需处理边界条件(如数组未旋转或只有一个元素)。
通过本文的分析,可以深入理解二分查找法在旋转排序数组中的应用,并掌握高频疑问的核心逻辑。
相关文章:
LeetCode 153. 寻找旋转排序数组中的最小值:二分查找法详解及高频疑问解析
文章目录 问题描述算法思路:二分查找法关键步骤 代码实现代码解释高频疑问解答1. 为什么循环条件是 left < right 而不是 left < right?2. 为什么比较 nums[mid] > nums[right] 而不是 nums[left] < nums[mid]?3. 为什么 right …...

基于QT(C++)OOP 实现(界面)酒店预订与管理系统
酒店预订与管理系统 1 系统功能设计 酒店预订是旅游出行的重要环节,而酒店预订与管理系统中的管理与信息透明是酒店预订业务的关键问题所在,能够方便地查询酒店信息进行付款退款以及用户之间的交流对于酒店预订行业提高服务质量具有重要的意义。 针对…...
人工智能100问☞第25问:什么是循环神经网络(RNN)?
目录 一、通俗解释 二、专业解析 三、权威参考 循环神经网络(RNN)是一种通过“记忆”序列中历史信息来处理时序数据的神经网络,可捕捉前后数据的关联性,擅长处理语言、语音等序列化任务。 一、通俗解释 想象你在和朋友聊天,每说一句话都会根据之前的对话内容调整语气…...

机械元件杂散光难以把控?OAS 软件案例深度解析
机械元件的杂散光分析 简介 在光学系统设计与工程实践中,机械元件的杂散光问题对系统性能有着不容忽视的影响。杂散光会降低光学系统的信噪比、图像对比度,甚至导致系统功能失效。因此,准确分析机械元件杂散光并采取有效抑制措施,…...

游戏引擎学习第289天:将视觉表现与实体类型解耦
回顾并为今天的工作设定基调 我们正在继续昨天对代码所做的改动。我们已经完成了“脑代码(brain code)”的概念,它本质上是一种为实体构建的自组织控制器结构。现在我们要做的是把旧的控制逻辑迁移到这个新的结构中,并进一步测试…...

【Linux网络】ARP协议
ARP协议 虽然我们在这里介绍 ARP 协议,但是需要强调,ARP 不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议。 ARP数据报的格式 字段长度(字节)说明硬件类型2网络类型(如以太网为…...

MUSE Pi Pro 开发板 Imagination GPU 利用 OpenCL 测试
视频讲解: MUSE Pi Pro 开发板 Imagination GPU 利用 OpenCL 测试 继续玩MUSE Pi Pro,今天看下比较关注的gpu这块,从opencl看起,安装clinfo指令 sudo apt install clinfo 可以看到这颗GPU是Imagination的 一般嵌入式中gpu都和hos…...

多线程与线程互斥
我们初步学习完线程之后,就要来试着写一写多线程了。在写之前,我们需要继续来学习一个线程接口——叫做线程分离。 默认情况下,新创建的线程是joinable的,线程退出后,需要对其进行pthread_join操作,否则无法…...
使用Spring Boot和Spring Security构建安全的RESTful API
使用Spring Boot和Spring Security构建安全的RESTful API 引言 在现代Web开发中,安全性是构建应用程序时不可忽视的重要方面。本文将介绍如何使用Spring Boot和Spring Security框架构建一个安全的RESTful API,并结合JWT(JSON Web Token&…...

游戏引擎学习第287天:加入brain逻辑
Blackboard:动态控制类似蛇的多节实体 我们目前正在处理一个关于实体系统如何以组合方式进行管理的问题。具体来说,是在游戏中实现多个实体可以共同或独立行动的机制。例如,我们的主角拥有两个实体组成部分,一个是身体࿰…...

continue通过我们的开源 IDE 扩展和模型、规则、提示、文档和其他构建块中心,创建、共享和使用自定义 AI 代码助手
一、软件介绍 文末提供程序和源码下载 Continue 使开发人员能够通过我们的开源 VS Code 和 JetBrains 扩展以及模型、规则、提示、文档和其他构建块的中心创建、共享和使用自定义 AI 代码助手。 二、功能 Chat 聊天 Chat makes it easy to ask for help from an LLM without…...

2025年EB SCI2区TOP,多策略改进黑翅鸢算法MBKA+空调系统RC参数辨识与负载聚合分析,深度解析+性能实测
目录 1.摘要2.黑翅鸢优化算法BKA原理3.改进策略4.结果展示5.参考文献6.代码获取7.读者交流 1.摘要 随着空调负载在电力系统中所占比例的不断上升,其作为需求响应资源的潜力日益凸显。然而,由于建筑环境和用户行为的变化,空调负载具有异质性和…...

.NET 中管理 Web API 文档的两种方式
前言 在 .NET 开发中管理 Web API 文档是确保 API 易用性、可维护性和一致性的关键。今天大姚给大家分享两种在 .NET 中管理 Web API 文档的方式,希望可以帮助到有需要的同学。 Swashbuckle Swashbuckle.AspNetCore 是一个流行的 .NET 库,它使得在 AS…...
常见三维引擎坐标轴 webgl threejs cesium blender unity ue 左手坐标系、右手坐标系、坐标轴方向
平台 / 引擎坐标系类型Up(上)方向Forward(前进)方向前进方向依据说明Unity左手坐标系YZtransform.forward 是 Z 轴正方向,默认摄像机朝 Z 看。Unreal Engine左手坐标系ZXUE 的角色面朝 X,默认使用 GetActor…...

【HTML】个人博客页面
目录 页面视图编辑 页面代码 解释: HTML (<body>): 使用了更加语义化的HTML5标签,例如<header>, <main>, <article>, <footer>。文章列表使用了<article>包裹,结构清晰。添加了分页导航。使用了Font…...

论文解读:ICLR2025 | D-FINE
[2410.13842] D-FINE: Redefine Regression Task in DETRs as Fine-grained Distribution Refinement D-FINE 是一款功能强大的实时物体检测器,它将 DETRs 中的边界框回归任务重新定义为细粒度分布细化(FDR),并引入了全局最优定位…...

9.DMA
目录 DMA —为 CPU 减负 DMA 的简介和使用场景 DMA 的例子讲解 STM32 的 DMA 框图和主要特性 编辑 DMA 的通道的对应通道外设 – DMA 和哪些外设使用 编辑编辑ADC_DR 寄存器地址的计算 常见的数据滤波方法 ADCDMA 的编程 DMA —为 CPU 减负 DMA 的简介和使用场…...

大语言模型 10 - 从0开始训练GPT 0.25B参数量 补充知识之模型架构 MoE、ReLU、FFN、MixFFN
写在前面 GPT(Generative Pre-trained Transformer)是目前最广泛应用的大语言模型架构之一,其强大的自然语言理解与生成能力背后,是一个庞大而精细的训练流程。本文将从宏观到微观,系统讲解GPT的训练过程,…...

python基础语法(三-中)
基础语法3: 2.列表与元组: <1>.列表、元组是什么? 都用来存储数据,但是两者有区别,列表可变,元组不可变。 <2>.创建列表: 创建列表有两种方式: [1].a 【】&#x…...
【gitee 初学者矿建仓库】
简易的命令行入门教程: Git 全局设置: git config --global user.name "你的名字"触摸 git config --global user.email "你的邮箱"创建 git 仓库: mkdir codestore cd codestore git init -b "main" touch README.md # 选择运行 git add REA…...
思路收集文档
降低工作量思路 nodejsjava混合网站开发...
OpenCV 光流估计:从原理到实战
在计算机视觉领域,光流估计(Optical Flow Estimation)是一项至关重要的技术,它能够通过分析视频序列中图像像素的运动信息,捕捉物体和相机的运动情况。OpenCV 作为强大的计算机视觉库,为我们提供了高效实现…...
使用HtmlAgilityPack采集墨迹天气中的天气数据
需要解析对应的HTML源码: <div class"left"><div class"wea_alert clearfix"><ul><li><a href "https://tianqi.moji.com/aqi/china/jiangxi/hukou-county" >< span class"level level_2&qu…...

ZTE 7551N 中兴小鲜60 远航60 努比亚小牛 解锁BL 刷机包 刷root 展讯 T760 bl
ZTE 7551N 中兴小鲜60 远航60 努比亚小牛 解锁BL 刷机包 刷root 3款机型是一个型号,包通用, ro.product.system.modelZTE 7551N ro.product.system.nameCN_P720S15 #################################### # from generate-common-build-props # Th…...
SearxNG本地搜索引擎
SearxNG 是一个强大、开源的 元搜索引擎(meta search engine),它不会存储用户信息,注重隐私保护,并支持从多个搜索引擎聚合结果,用户可以自建部署,打造一个无广告、可定制的搜索平台。 🔍 什么是 SearxNG? SearxNG 是 Searx 的一个积极维护的分支(fork),意在改进…...
MyBatis 核心组件源码分析
MyBatis 作为 Java 领域最受欢迎的持久层框架之一,以灵活的 SQL 映射和强大的扩展性著称。要真正驾驭 MyBatis,深入理解其核心组件的源码实现是关键。本文将通过源码分析,结合图文并茂的方式,带大家揭开 MyBatis 核心组件的神秘面纱。 1.SqlSessionFactory:会话工厂的核心…...

信息系统项目管理师高级-软考高项案例分析备考指南(2023年案例分析)
个人笔记整理---仅供参考 计算题 案例分析里的计算题就是进度、挣值分析、预测技术。主要考査的知识点有:找关键路径、求总工期、自由时差、总时差、进度压缩资源平滑、挣值计算、预测计算。计算题是一定要拿下的,做计算题要保持头脑清晰,认真读题把PV、…...
stack和queue简单模拟实现
stackreverse_iteratorqueuepriority_queue仿函数具体代码 stack Stacks are a type of container adaptor, specifically designed to operate in a LIFO context (last-in first-out), where elements are inserted and extracted only from one end of the container. 上述描…...
如何安装双系统?即windows已经安装,如何安装ubuntu 22.04LTS
在已安装 Windows 的电脑上安装 Ubuntu 22.04 LTS 双系统,需通过 分区调整、UEFI/BIOS 设置 和 引导管理 实现。以下是详细步骤: 一、准备工作 备份数据 • 备份 Windows 中的重要文件(防止分区操作失误导致数据丢失)。 下载 Ubu…...

产品经理入门(2)产品体验报告
产品体验报告大纲:重点在产品体验——优点。 1.产品概括 可以从各大平台搜产品介绍。 2.市场分析 按照产品方向分析各个指标——包括有效使用时间,市场规模等。 3. 用户分析——对用户通过各项指标画像。 4.产品体验——对各项功能与设计的体验。 5.报告总结...