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

LeetCode 153. 旋转排序数组找最小值:二分最优思路

LeetCode中等难度的经典题目——153. 寻找旋转排序数组中的最小值。这道题的核心考点是「二分查找」难点在于如何利用“旋转排序数组”的特性在O(log n)时间复杂度内找到最小值也是面试中常考的二分变形题。一、题目解读读懂旋转排序数组首先我们得先搞懂「旋转排序数组」到底是什么。题目里说原数组是升序排列的经过1到n次旋转后得到输入数组。这里的“旋转”很简单每次旋转就是把数组最后一个元素移到最前面。举个例子更直观原升序数组[0,1,2,4,5,6,7]旋转4次把最后一个元素依次移到前面最终得到 [4,5,6,7,0,1,2]旋转7次相当于旋转了一圈回到原数组 [0,1,2,4,5,6,7]题目给出的关键条件数组元素互不相同这个条件很重要能简化判断避免边界陷阱要求我们找到数组中的最小元素并且必须设计时间复杂度为O(log n)的算法。为什么不能用遍历O(n)因为题目明确要求O(log n)而二分查找的时间复杂度正好是O(log n)所以这道题的核心思路就是「二分查找」的变形。二、核心思路二分查找如何适配旋转数组普通二分查找是在有序数组中找目标值而旋转排序数组的特点是它被分成了两个升序子数组且前一个子数组的所有元素都大于后一个子数组的所有元素比如 [4,5,6,7,0,1,2]前半段 [4,5,6,7] 升序后半段 [0,1,2] 升序且 7 0。最小值就是这两个子数组的“分界点”——前一个子数组的最后一个元素后一个子数组的第一个元素。我们的目标就是通过二分查找快速定位到这个分界点。二分查找的关键的是「确定边界收缩方向」这里我们以「中间元素 nums[mid] 和右边界元素 nums[high] 比较」为判断依据原因很简单右边界的元素一定属于其中一个升序子数组能帮我们快速锁定最小值所在的区间。关键判断逻辑重中之重如果 nums[mid] nums[high]说明 mid 所在的位置已经在「右半段升序子数组」中因为右半段是升序的mid 比 high 小说明 mid 到 high 都是升序此时最小值一定在 mid 及其左边所以收缩右边界high mid。如果 nums[mid] nums[high]说明 mid 所在的位置还在「左半段升序子数组」中左半段所有元素都比右半段大此时最小值一定在 mid 的右边所以收缩左边界low mid 1。为什么不用 nums[mid] 和 nums[low] 比较大家可以思考一下如果数组没有旋转就是原升序数组nums[mid] 一定大于 nums[low]此时最小值在左边但如果数组旋转了比如 [3,4,5,1,2]nums[mid]5大于 nums[low]3但最小值却在右边这样判断会出错。所以用 nums[mid] 和 nums[high] 比较是最稳妥的。三、代码解析逐行看懂核心逻辑题目给出的代码非常简洁只有几行但每一行都有其作用我们逐行拆解functionfindMin(nums:number[]):number{letlow0;// 左边界指针初始指向数组第一个元素lethighnums.length-1;// 右边界指针初始指向数组最后一个元素while(lowhigh){// 循环条件左边界 右边界当low high时就是最小值所在位置constmidMath.floor((highlow)/2);// 计算中间索引避免溢出也可以用 (low high) 1if(nums[mid]nums[high]){// 中间元素 右边界元素最小值在左区间highmid;// 收缩右边界到mid注意不是mid-1因为mid可能就是最小值}else{// 中间元素 右边界元素最小值在右区间lowmid1;// 收缩左边界到mid1mid不可能是最小值直接跳过}}returnnums[low];// 循环结束后low high就是最小值的索引};代码细节注意点mid 的计算Math.floor((high low) / 2) 是最基础的写法也可以用位运算 (low high) 1效果相同效率更高但要注意避免 low high 溢出本题中数组长度不会太大溢出概率极低。循环条件low high而不是 low ≤ high。因为当 low high 时已经找到了最小值循环可以终止直接返回 nums[low] 即可。high mid 而非 mid-1因为当 nums[mid] nums[high] 时mid 有可能就是最小值比如数组 [2,1]mid0nums[mid]2 nums[high]1执行 lowmid11循环结束返回 nums[1]1再比如 [3,1,2]mid1nums[mid]1 nums[high]2执行 highmid1循环结束返回 1。如果写成 highmid-1可能会跳过最小值。low mid 1因为当 nums[mid] nums[high] 时mid 一定不是最小值比如 [4,5,6,7,0,1,2]mid3nums[mid]7 nums[high]2最小值在 mid 右边所以直接让 lowmid1。四、考点总结与拓展思考考点总结这道题的核心是「二分查找的变形」重点考查对“旋转排序数组”特性的理解以及如何确定二分查找的边界收缩方向。关键在于抓住“旋转数组的两个升序子数组右半段所有元素小于左半段”这一特点通过 mid 和 high 的比较快速锁定最小值所在区间。时间复杂度O(log n)二分查找的经典时间复杂度空间复杂度O(1)只用到了3个变量low、high、mid没有额外空间开销。拓展思考进阶如果题目修改为「数组元素可能重复」比如 nums [2,2,2,0,1]此时原代码还能生效吗答案是不能。因为当 nums[mid] nums[high] 时我们无法判断最小值在左还是右比如 [2,0,2,2,2] 和 [2,2,2,0,2]mid 和 high 都是2但最小值位置不同。这种情况下我们需要增加一个处理逻辑当 nums[mid] nums[high] 时让 high–缩小范围因为重复元素不影响最小值的查找修改后的代码可以应对元素重复的情况有兴趣的同学可以自行尝试编写。五、最后总结LeetCode 153 是一道非常经典的二分变形题难度中等适合巩固二分查找的思路。解题的关键在于理解旋转排序数组的结构两个升序子数组分界点为最小值选择正确的比较对象mid 和 high确定边界收缩方向注意边界细节比如 high mid 而非 mid-1。

相关文章:

LeetCode 153. 旋转排序数组找最小值:二分最优思路

LeetCode中等难度的经典题目——153. 寻找旋转排序数组中的最小值。这道题的核心考点是「二分查找」,难点在于如何利用“旋转排序数组”的特性,在O(log n)时间复杂度内找到最小值,也是面试中常考的二分变形题。 一、题目解读:读懂…...

uniapp中如何用lottie-miniprogram加载json动画?5分钟搞定炫酷效果

Uniapp中5分钟集成Lottie动画:从原理到实战的完整指南 在移动应用开发中,精美的动画效果往往能显著提升用户体验。对于Uniapp开发者来说,Lottie-miniprogram提供了一种高效的方式,可以直接加载设计师导出的JSON动画文件&#xff0…...

win11 WSL ubuntu24.04 安装两个、重命名

导出: wsl --export Ubuntu-24.04 D:\Ubuntu-24.04.tar导入新镜像: wsl --import Ubuntu-24.04-2 D:\Ubuntu-24.04-2\Ubuntu-24.04-2 D:\Ubuntu-24.04.tar...

手把手教你用RTABMAP+T265在Windows10上实现室内三维扫描(含标定技巧)

手把手教你用RTABMAPT265在Windows10上实现高精度室内三维扫描 第一次接触室内三维扫描时,我被这项技术深深吸引——它能让物理空间瞬间数字化,就像给现实世界按下"CtrlC"。但真正动手配置RTABMAP和T265相机时,才发现这条路并不平坦…...

OpenClaw多模型切换指南:Qwen3-32B与本地Llama混合调用

OpenClaw多模型切换指南:Qwen3-32B与本地Llama混合调用 1. 为什么需要多模型切换? 去年冬天,当我第一次尝试用OpenClaw自动处理周报时,发现一个有趣的现象:用同一个模型处理文本润色和代码生成任务,效果差…...

MAX17332 Arduino库详解:单节锂电池燃料计量与独立充电控制

1. 项目概述 MAX17332 是 Maxim Integrated(现为 Analog Devices)推出的一款高度集成的单节锂离子/锂聚合物电池管理芯片,专为紧凑型便携设备设计。它并非传统意义上的“纯BMS”(Battery Management System)&#xff0…...

计算机毕业设计:基于Django与LSTM的大众点评评价预测系统 Django框架 LSTM Hadoop Spark Hive 可视化 大数据 食品 食物(建议收藏)✅

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,…...

BlueROV2进阶:巧用ArduSub参数配置实现多舵机协同控制

1. 从单舵机到多舵机协同的跨越 第一次用Pixhawk控制单个舵机转动时的兴奋感还记忆犹新,但当真正开始构建BlueROV2这样的水下机器人时,你会发现单一舵机控制远远不够。想象一下这样的场景:机械爪需要精准开合,云台要平稳转动&…...

告别论文 ddl 焦虑!PaperZZ AI:本科毕业论文从 0 到 1 的极速生成攻略[特殊字符]

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿/期刊论文paperzz - 毕业论文-AIGC论文检测-AI智能降重-ai智能写作https://www.paperzz.cc/dissertation 还在为本科毕业论文熬大夜?选题没思路、文献找不到、大纲搭不起来、初稿写不出…… 无数…...

FastAPI流式AI接口设计陷阱大全(2024高频真题+源码级调试实录)

第一章:FastAPI流式AI接口设计陷阱大全(2024高频真题源码级调试实录)流式响应被中间件静默截断 FastAPI 默认启用的 Starlette 中间件(如 HTTPSRedirectMiddleware 或自定义日志中间件)可能在未显式处理 StreamingResp…...

【FastAPI 2.0流式AI响应核心机密】:3大异步协程调度陷阱、2处EventSource底层劫持点、1个未公开的StreamingResponse状态机设计缺陷

第一章:FastAPI 2.0流式AI响应的架构演进与设计哲学FastAPI 2.0 将流式响应能力从实验性支持提升为核心原语,其底层重构了 Starlette 的响应生命周期与事件循环集成机制,使 Server-Sent Events(SSE)、text/event-strea…...

遥感影像配准总对不齐?OpenCV+RST+PROJ4三重坐标系对齐实战(附WGS84→UTM→影像本地坐标的转换矩阵速查表)

第一章:Shell脚本的基本语法和命令Shell脚本是Linux/Unix系统自动化任务的核心工具,以可执行文本文件形式存在,由Bash等shell解释器逐行解析运行。其语法简洁但严谨,对空格、分号、引号和换行符敏感,需严格遵循语法规则…...

OpenClaw隐私方案:nanobot镜像本地化部署与敏感数据处理实践

OpenClaw隐私方案:nanobot镜像本地化部署与敏感数据处理实践 1. 为什么需要本地化部署的AI助手? 去年在处理一份涉及客户隐私的法律文件时,我遇到了一个两难选择:要么手动逐条整理数百页文档,要么使用云端AI工具但面…...

开源 AI 应用平台实战部署:从零搭建到插件调试避坑指南

1. 开源AI平台部署前的环境准备 在开始部署Dify和AIFlowy之前,环境准备是至关重要的一步。我遇到过不少开发者因为基础环境没配好,导致后续步骤频繁报错的情况。这里分享下Windows和Linux双平台下的实战经验。 对于Dify平台,你需要准备Python…...

智能家居控制中心:OpenClaw+Qwen3.5-9B语音指令中转

智能家居控制中心:OpenClawQwen3.5-9B语音指令中转 1. 为什么需要语音控制的智能家居中枢? 去年装修新房时,我装了十几款不同品牌的智能设备——从米家的灯泡到涂鸦的窗帘电机,再到HomeKit的温控器。每次想调整家居状态&#xf…...

从安装到跑通第一个旋转立方体:Ubuntu 22.04 + OpenGL完整开发环境搭建实录

从零到旋转立方体:Ubuntu 22.04下OpenGL开发环境实战指南 刚接触图形编程时,最令人兴奋的莫过于看到自己编写的代码在屏幕上"活"起来。本文将带你从零开始,在Ubuntu 22.04系统上搭建完整的OpenGL开发环境,并最终实现一个…...

OpenClaw负载测试:GLM-4.7-Flash并发处理能力评估

OpenClaw负载测试:GLM-4.7-Flash并发处理能力评估 1. 测试背景与目标 上周在尝试用OpenClaw自动化处理一批市场调研报告时,遇到了一个典型问题:当我同时提交20份PDF文件让AI助手提取关键数据时,系统开始出现响应延迟和部分任务超…...

MySQL 事务机制深度解析:从 ACID 到底层实现

MySQL 事务机制深度解析:从 ACID 到底层实现 MySQL 的事务机制主要由 InnoDB 存储引擎 实现,核心围绕 ACID 四大特性,通过 日志系统(redo log、undo log)、锁机制 和 MVCC(多版本并发控制) 共同…...

RRT*在ROS中的实战:用Gazebo仿真实现动态避障(Python+ROS Noetic)

RRT*在ROS中的实战:用Gazebo仿真实现动态避障(PythonROS Noetic) 路径规划是机器人自主导航的核心技术之一。在复杂动态环境中,如何快速找到一条安全且优化的路径一直是研究热点。RRT*(Rapidly-exploring Random Trees…...

小型电商自动化:OpenClaw+nanobot处理订单邮件

小型电商自动化:OpenClawnanobot处理订单邮件 1. 为什么选择OpenClaw处理电商订单 作为一个经营小型电商的个体商户,我每天要处理几十封来自Gmail的订单邮件。这些邮件包含客户信息、商品清单和收货地址,需要手动录入到库存表格、生成物流单…...

ncmdumpGUI:突破网易云音乐NCM格式限制的高效解决方案

ncmdumpGUI:突破网易云音乐NCM格式限制的高效解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI ncmdumpGUI是一款开源的音频格式转换工具&am…...

单片机开发三大软件架构对比与实践

单片机开发常用软件架构深度解析1. 项目概述在嵌入式系统开发中,软件架构设计直接影响系统的可靠性、可维护性和实时性。本文系统分析三种主流单片机软件架构方案,包括时间片轮询法、操作系统方案和前后台顺序执行法,为开发者提供架构选型参考…...

el-tabs报错Cannot read properties of null (reading ‘insertBefore‘)

使用elementui-plus的tabs组件在开发中遇到的一个问题,分析了代码,发现逻辑没有任何问题,但是点击tab切换就会报错:Uncaught (in promise) TypeError: Cannot read properties of null (reading insertBefore)调试发现parent参数是…...

【Python时序预测实战】基于贝叶斯优化的Transformer单变量时序预测模型构建与调优

1. 为什么选择Transformer做时序预测? 我第一次用Transformer做销量预测时,心里其实挺没底的。毕竟这玩意儿原本是搞自然语言处理的,就像拿菜刀削苹果——工具不太对口。但当我看到预测结果比传统LSTM提升了23%的准确率时,立刻真香…...

别再只仿真了!手把手教你用LabVIEW+USRP-2920搭建真实无线通信链路(BPSK/QPSK调制实战)

从仿真到实战:LabVIEW与USRP-2920构建无线通信链路的完整指南 在通信工程领域,仿真与硬件实现之间往往存在一道难以逾越的鸿沟。许多工程师能够熟练使用MATLAB或LabVIEW进行通信系统仿真,但当面对USRP-2920这样的射频硬件时,却常常…...

如何用ASR6601实现22dBm发射功率?LoRa模组射频优化全流程

ASR6601射频性能深度优化:从原理到22dBm发射功率实战指南 在低功耗广域物联网(LPWAN)领域,LoRa技术凭借其出色的传输距离和抗干扰能力,已成为智慧城市、工业监测等场景的首选方案。而ASR6601作为国产化LoRa SoC的佼佼者,其集成的A…...

Vue3 的 JSX 函数组件,每次更新都会重新运行吗?

我用最直白、最无歧义、100%准确的方式,只回答你这一个问题: ✅ 最终答案(背它) 在 Vue3 中: 你写的 JSX 函数组件,整个函数 只会在组件初始化时运行 1 次! 更新时,整个函数 不会重新…...

Halcon一维码识别避坑指南:从模糊图像到精准解码

Halcon一维码识别实战:攻克模糊图像与复杂场景的五大策略 在物流分拣线上,传送带以每秒2米的速度运行,扫码枪却频繁报错——这不是设备故障,而是Halcon参数配置与图像预处理策略的缺失。当条形码出现在褶皱包装、反光表面或运动模…...

C#频谱图振动传感器温度传感器数据采集绘制频谱图和时域图,并存储数据库存储时间200ms左右

C#频谱图振动传感器温度传感器数据采集绘制频谱图和时域图,并存储数据库存储时间200ms左右,可以进行历史频谱图和时域图回放,可以求的最大值并设置阈值报警可以导出报警最近在搞工业设备监控系统的时候,需要实时采集振动和温度数据…...

别再手动算内存了!用STM32CubeIDE的Build Analyzer,5分钟摸清你的H743芯片还剩多少FLASH和RAM

深度解析STM32CubeIDE内存分析:从Build Analyzer到高效内存管理实战 在嵌入式开发的世界里,内存就像是一块珍贵的画布——有限且昂贵。想象一下,当你精心设计的STM32H743程序在关键时刻崩溃,而问题可能仅仅是因为某个全局变量悄悄…...