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

[特殊字符] 旋转排序数组中的高效搜索:从线性到二分查找的进阶之路

给定一个由不同元素构成的旋转排序数组原本是升序排列但在某个未知点进行了旋转要求快速找到目标元素的索引。如果不存在则返回 -1。示例 1输入arr [5, 6, 7, 8, 9, 10, 1, 2, 3],key 3输出8示例 2输入arr [3, 5, 1, 2],key 6输出-1示例 3输入arr [33, 42, 72, 99],key 42输出1目录朴素解法线性搜索 - O(n) 时间 O(1) 空间期望解法一两次二分查找 - O(log n) 时间 O(1) 空间期望解法二单次二分查找 - O(log n) 时间 O(1) 空间1. 朴素解法线性搜索最直接的方式就是遍历整个数组逐个元素与目标值比较。找到则返回索引否则返回 -1。复杂度分析时间复杂度O(n) —— 最坏情况下需要检查所有元素。空间复杂度O(1) —— 只用了常数个变量。代码示例Pythondefsearch(arr,key):foriinrange(len(arr)):ifarr[i]key:returnireturn-1虽然简单但效率不高。当数组很大时线性搜索会非常慢。接下来我们看看如何利用旋转排序数组的特性来加速。说到旋转排序数组的二分查找很多人卡在“如何判断哪半有序”这个点上。死磕代码不如亲眼看到指针如何移动——强烈安利一个叫图码的网站它把60多种算法做成交互式动画你可以自己输入测试数据甚至上传C/C/Java/Python代码看着代码一行行跑出动画。这个工具专门为408考研和数据结构期末考试设计全书级知识点可运行代码遇到不懂的还能7x24小时选中代码让AI解释。学算法可视化上图码就对了。图码-数据结构与算法交互式可视化平台访问网站https://totuma.cn2. 期望解法一两次二分查找核心思路是先找到数组中**最小元素即旋转点**的索引这样就把原数组分成了两个有序的子数组。然后根据目标值与第一个元素的大小关系决定在哪个子数组上进行标准的二分查找。步骤详解找到最小元素的索引pivot旋转点。如果arr[pivot] key直接返回pivot。如果pivot 0说明整个数组是未旋转的直接对整个数组做二分查找。否则比较key和arr[0]若key arr[0]则在左半部分[0, pivot-1]进行二分查找。否则在右半部分[pivot1, n-1]进行二分查找。复杂度分析时间复杂度O(log n) —— 两次二分查找每次都是 O(log n)。空间复杂度O(1) —— 只用了常数个变量。代码示例PythondefbinarySearch(arr,lo,hi,x):whilelohi:midlo(hi-lo)//2ifarr[mid]x:returnmidifarr[mid]x:lomid1else:himid-1return-1deffindPivot(arr,lo,hi):whilelohi:ifarr[lo]arr[hi]:returnlo mid(lohi)//2ifarr[mid]arr[hi]:lomid1else:himidreturnlodefsearch(arr,key):nlen(arr)pivotfindPivot(arr,0,n-1)ifarr[pivot]key:returnpivotifpivot0:returnbinarySearch(arr,0,n-1,key)ifarr[0]key:returnbinarySearch(arr,0,pivot-1,key)returnbinarySearch(arr,pivot1,n-1,key)输出83. 期望解法二单次二分查找更优雅的做法是直接对旋转数组进行一次修改过的二分查找。在每一次迭代中我们检查中间元素arr[mid]是否等于目标值。如果不是我们就判断左半部分还是右半部分是有序的然后根据目标值是否落在该有序区间内来调整搜索范围。算法流程初始化lo 0,hi n-1。当lo hi时计算mid lo (hi - lo) // 2。如果arr[mid] key返回mid。判断左半部分是否有序arr[mid] arr[lo]。如果左半部分有序且key在[arr[lo], arr[mid])范围内则hi mid - 1否则lo mid 1。否则右半部分有序如果key在(arr[mid], arr[hi]]范围内则lo mid 1否则hi mid - 1。如果循环结束未找到返回 -1。复杂度分析时间复杂度O(log n) —— 每次迭代将搜索范围缩小一半。空间复杂度O(1) —— 只用了常数个变量。代码示例Pythondefsearch(arr,key):lo,hi0,len(arr)-1whilelohi:midlo(hi-lo)//2ifarr[mid]key:returnmid# 左半部分有序ifarr[mid]arr[lo]:ifkeyarr[lo]andkeyarr[mid]:himid-1else:lomid1# 右半部分有序else:ifkeyarr[mid]andkeyarr[hi]:lomid1else:himid-1return-1输出8总结解法时间复杂度空间复杂度说明线性搜索O(n)O(1)简单但慢两次二分O(log n)O(1)先找旋转点再二分单次二分O(log n)O(1)直接修改二分查找逻辑推荐使用单次二分查找因为它代码更简洁且不需要额外寻找旋转点。掌握旋转排序数组的搜索不仅能应对面试题更能加深对二分查找变体的理解。下次遇到类似问题记得试试这个技巧哦

相关文章:

[特殊字符] 旋转排序数组中的高效搜索:从线性到二分查找的进阶之路

给定一个由不同元素构成的旋转排序数组(原本是升序排列,但在某个未知点进行了旋转),要求快速找到目标元素的索引。如果不存在,则返回 -1。 示例 1: 输入:arr [5, 6, 7, 8, 9, 10, 1, 2, 3], …...

VMware Workstation Pro 17上快速体验Rocky Linux 8.6:从镜像下载到命令行登录的5分钟极简流程

VMware Workstation Pro 17极速部署Rocky Linux 8.6实战指南 当技术爱好者们想要快速搭建一个Linux测试环境时,繁琐的安装流程往往会消耗大量时间。本文将展示如何在VMware Workstation Pro 17上,用最短时间完成Rocky Linux 8.6的部署,从零开…...

告别无效编程!Cursor + 高德地图实战,解锁AI开发效率密码

当GitHub Copilot还在逐行补全代码时,Cursor已经让开发者用"聊天"的方式写项目了。从Cursor的四大快捷键到AI幻觉的实战应对,从Vibe Coding的前沿理念到高德地图的AI落地实践,本文将带你深度理解AI编程的现在与未来。 目录 一、Cur…...

终极指南:5分钟解决BepInEx插件框架的90%常见问题 [特殊字符]

终极指南:5分钟解决BepInEx插件框架的90%常见问题 🚀 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是Unity游戏社区中最受欢迎的插件框架之一&…...

Unity Mecanim根运动偏转原理与四层解决方案

1. 这个问题不是Bug,是Mecanim对“根运动”最诚实的执行你有没有遇到过这样的情况:一个角色模型在Unity里播放完一段奔跑动画后,整个人歪着身子斜插进地面;或者转身动画播完,角色原地旋转了360度还多转了45度&#xff…...

Appium Android自动化环境四段链路深度验证指南

1. 这不是装几个软件就能跑起来的事:为什么90%的人卡在环境搭建第一步 “PythonAndroidAppium App自动化测试环境搭建”——光看标题,很多人第一反应是:不就是装Python、配JDK、下Android SDK、跑个appium命令?我试过三次&#x…...

Charles断点调试:HTTP/HTTPS流量精准控制与实战避坑

1. 这不是“抓包”,是精准外科手术式调试 很多人第一次听说 Charles,第一反应是“哦,又一个抓包工具”。但如果你真这么用,大概率会在某次接口联调中卡住两小时,反复刷新页面却始终看不到后端返回的错误码&#xff0c…...

Burp Suite Professional实战卡点解析:HTTPS抓包、代理拦截与Intruder失效根因

1. 这不是“点开就能用”的工具,而是Web安全工程师的呼吸节奏很多人第一次打开Burp Suite Professional,盯着那个灰色的拦截开关发呆——明明浏览器配置了代理,HTTPS网站也装了CA证书,可流量就是不进Intruder、Repeater里不动如山…...

机器学习记忆化:平衡隐私、鲁棒性与公平性的核心技术挑战

1. 项目概述:当机器学习开始“记住”数据时,我们面临什么?在构建一个机器学习模型时,我们总希望它能像一位聪明的学生,不仅记住课本上的例题,更能理解背后的原理,从而在考场上举一反三。但现实往…...

基于Transformer的行星大气辐射传输仿真器:百倍加速与1%精度

1. 项目概述:用Transformer重塑行星大气辐射传输计算在行星科学和天体物理领域,模拟一颗行星的大气层如何吸收、散射和发射星光与热辐射,是理解其气候、演化乃至潜在宜居性的基石。这个过程的核心,就是辐射传输计算。无论是预测即…...

RL-ARM CAN迁移至CMSIS-RTOS的实践指南

1. 从RL-ARM CAN到CMSIS-RTOS的迁移背景在嵌入式开发领域,随着Keil MDK版本的迭代,RL-ARM库中的CAN组件逐渐向MDK Middleware过渡。许多基于MDK v4和早期v5版本开发的项目,都使用了RL-ARM库中的CAN驱动实现。当开发者需要将项目升级到较新的M…...

基于CNN的食双星参数快速预测:ebop_maven模型原理与应用

1. 项目概述与核心思路食双星,也就是我们常说的食变星,是研究恒星质量、半径、光度乃至演化过程的一把“金钥匙”。传统上,要解开这把锁,天文学家们得依赖像jktebop、PHOEBE这类物理模型拟合工具。这个过程就像解一个极其复杂的多…...

医学影像AI迁移学习:如何科学选择预训练数据集?

1. 项目概述在医学影像分析这个对精度和可靠性要求极高的领域,迁移学习已经成为解决数据稀缺问题的关键技术路径。其核心逻辑很直观:与其在有限的目标数据上从头训练一个复杂的深度学习模型,不如先在一个庞大的、通用的源数据集上“预训练”模…...

DeepMech:基于图神经网络与模板学习的化学反应机理预测框架

1. 项目概述与核心挑战 化学反应机理预测,简单来说,就是给定反应物,让计算机告诉我们这个反应具体是怎么一步步发生的。这就像看一部侦探电影,我们不仅要知道“谁是凶手”(最终产物),更想搞清楚…...

如何快速掌握BepInEx插件框架:新手的完整避坑指南

如何快速掌握BepInEx插件框架:新手的完整避坑指南 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx插件框架是Unity Mono、IL2CPP和.NET框架游戏的强大插件和模组…...

AssetRipper深度解析:Unity资源静态解析原理与工程化实践

1. 这不是“破解工具”,而是Unity开发者自己的资源归档方案AssetRipper这个名字,对很多刚接触Unity反编译的开发者来说,第一反应是“哦,那个能扒出美术资源的软件”。但如果你真这么用它,大概率会在三天内遇到贴图全黑…...

差分隐私公平性:基于群体自适应裁剪的DP-SGD改进算法

1. 项目概述与核心问题在构建负责任的人工智能系统时,我们常常面临一个看似矛盾的双重目标:既要保护用户数据的隐私,又要确保算法决策对不同群体是公平的。差分隐私(Differential Privacy, DP)技术,通过在训…...

别再死记硬背了!用这5个Unity粒子特效案例,彻底搞懂ParticleSystem核心参数

别再死记硬背了!用这5个Unity粒子特效案例,彻底搞懂ParticleSystem核心参数粒子特效是游戏开发中不可或缺的视觉元素,从角色技能到环境氛围,都离不开ParticleSystem的灵活运用。但很多开发者在学习过程中陷入了一个误区——试图通…...

起点中文网字体反爬破解:WOFF2解析与PUA映射还原实战

1. 为什么起点中文网的字体反爬让90%的爬虫新手直接卡死在第一章?你写好requests,配好headers,连上代理池,信心满满地把起点中文网的小说页面curl下来——结果页面里本该是“第123章 天降神兵”的地方,赫然显示一串乱码…...

图神经网络在高能物理径迹重建中的应用:ETX4VELO项目解析

1. 项目概述:当图神经网络遇上高能物理径迹重建在大型强子对撞机(LHC)的LHCb实验中,每秒发生着数千万次质子-质子对撞,产生海量的次级粒子。这些粒子穿过探测器,留下一串串被称为“击中点”的信号。将这些离…...

Unity Library文件夹不是缓存,而是项目运行时核心枢纽

1. Library文件夹不是“缓存”,而是Unity工程的“神经系统”在Unity项目里,只要有人提“工程太大”,十有八九会冒出一句:“删掉Library文件夹不就完了?”——这话我听过不下五十遍,从刚入行的实习生&#x…...

告别‘找茬’游戏:用Python复现ALCNet,让红外小目标检测又快又准

从理论到实践:用Python实现ALCNet红外小目标检测全流程红外图像中的小目标检测一直是计算机视觉领域的难点——目标可能只有几个像素大小,却要对抗复杂的背景噪声。传统方法依赖人工设计的特征,而ALCNet通过膨胀局部对比度度量和循环移位加速…...

机器学习发现物理守恒量:从数据中挖掘对称性与不变性

1. 项目概述:当机器学习遇见物理学的“不变性”在物理学的世界里,对称性与守恒量是理解宇宙运行规律的基石。从牛顿时代起,我们就知道一个系统如果具有时间平移对称性,那么它的能量就是守恒的;如果具有空间平移对称性&…...

避坑指南:UE球形遮罩材质边缘闪烁、接缝问题分析与修复(附完整节点图)

深度解析:UE球形遮罩材质边缘闪烁与接缝问题的终极解决方案在虚幻引擎中实现球形遮罩效果是许多项目中的常见需求,但开发者们往往会遇到一个棘手的问题——遮罩边缘出现闪烁、锯齿或明显的接缝。这种现象不仅影响视觉效果,还可能破坏场景的整…...

SPTD:从训练动态中挖掘置信度信号,提升AI模型选择性预测能力

1. 项目概述:当模型学会说“我不知道”在医疗影像诊断、自动驾驶决策或者金融风控这些领域,一个AI模型的预测错误,代价可能是巨大的。我们通常希望模型不仅给出答案,还能告诉我们它对这个答案有多“确信”。这就是不确定性量化的核…...

深度强化学习在自动驾驶赛车中的迁移优化实践

1. 项目概述:深度强化学习在自动驾驶赛车中的迁移优化在自动驾驶赛车领域,如何将仿真环境中训练的控制策略无缝迁移到真实车辆上一直是个棘手问题。传统方法通常面临两大挑战:仿真环境与真实物理世界之间的动力学差异(即所谓的&qu…...

量子机器学习实战:遥感图像分割的混合模型构建与硬件噪声影响分析

1. 项目概述与核心挑战量子机器学习(QML)这个领域,听起来像是科幻小说里的概念,但过去几年,它已经从理论物理的殿堂,逐渐走进了我们这些做工程和算法应用的人的视野。简单来说,它试图用量子计算…...

NGUI性能优化实战:DrawCall控制与内存泄漏治理

1. 为什么今天还要谈NGUI?——一个被低估的“老派”UI系统的现实生命力很多人看到标题里的“NGUI”,第一反应是:“这玩意儿不是早该进博物馆了吗?”Unity官方从4.6版本起力推UGUI,2018年之后新项目几乎清一色UGUI&…...

Exchange渗透实战:从外部侦察到域控接管全链路

1. 这不是“黑进邮箱”的速成课,而是真实红队作业的切片回放Exchange Server 渗透测试,这个词在很多刚入行的朋友眼里,可能等同于“爆破邮箱密码”“下载邮件”“发钓鱼邮件”。但我在过去七年参与的23次企业红队评估中,真正能从外…...

图神经网络与神经算子:革新颗粒系统仿真的AI降阶建模

1. 项目概述:当图神经网络遇上颗粒世界在计算物理和工程仿真领域,颗粒系统(如沙土、粉末、谷物)的模拟一直是个“硬骨头”。传统的离散元法(DEM)虽然能精确刻画每个颗粒的牛顿运动方程和接触力学&#xff0…...