算法--搜索旋转排序数组

”搜索旋转排序数组“ 算法讲解 搜索旋转排序数组” 问题通过巧妙地运用二分查找思想,能够高效地在旋转后的排序数组中搜索目标元素。理解其背后的原理和实现方式,不仅有助于我们在算法面试中脱颖而出,也能在实际开发中处理类似特殊数据结构时游刃有余。希望通过本文的讲解和示例代码,大家能对该算法有更深入的认识和掌握。在后续的算法学习中,多进行实践和思考,不断提升自己的算法能力。 阅读详情

描述

假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 O(log n) 级别。

示例

示例 1: 输入: nums = [4,5,6,7,0,1,2], target = 0 输出: 4
示例 2: 输入: nums = [4,5,6,7,0,1,2], target = 3 输出: -1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析

首先如果这个数组是直接完全有序的数组,那么简单的二分查找就能解决问题,但是这里是在某个未知地方进行了旋转的,所以这里要将查找范围左移或右移的条件发生了一些改变。
至于这个新条件如何确定,我们要先明确一件事,那就是旋转位置的左边的数都大于或等于nums[0],旋转位置右边的数都小于nums[0],并且旋转位置两边的两个子列都各自有序。
现在来考虑什么时候把查找范围右移(即代码中的low=mid+1):
目前的mid指向的位置和target所在的位置(如果数组中存在target)在同一个有序子列且nums[mid]<target,即nums[mid]<target<nums[0]或者nums[0]<=nums[mid]<target。这时其实和有序数组的二分查找是一样的,如果nums[mid]<target说明目标target在mid的右侧,向右查找;
mid指向的位置在旋转位置左边而target在旋转位置右边(如果数组中存在target),即target < nums[0]<=nums[mid]。
对于其他情况,如果nums[mid] == target那就直接返回mid,再有其他情况那自然是向左查找了, 即high=mid-1。

实现

public int search(int[] nums, int target) {
        if (nums.length == 0) return -1;
        int low = 0, high = nums.length - 1, mid;
        while (low <= high) {
            mid = (high + low) / 2;
            if (nums[mid] == target)
                return mid;
            if ((nums[mid] < target && target < nums[0]) || (nums[mid] < target && nums[mid] >= nums[0])
                    || (nums[mid] >= nums[0] && target < nums[0]))
                low = mid + 1;
            else
                high = mid - 1;

        }
        return -1;
    }

参考

【算法Hot100系列】搜索旋转排序数组 💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨。 阅读详情

相关推荐

搜索旋转排序数组 II 算法

旋转排序数组是指在原本有序的数组中,将数组的一部分进行旋转后得到的数组。在这样的数组中,我们需要实现一种搜索算法,来判断给定的目标值是否存在于数组中。本文将介绍一种解决这个问题的算法,并提供相应的源代码。由于数组进行了旋转,因此无法直接应用传统的二分查找算法。但我们可以对原有的二分查找算法进行一些调整,以适应旋转排序数组的特殊性。以上代码通过修改二分查找算法,实现了在旋转排序数组中搜索目标值的功能。算法的时间复杂度为 O(log n),其中 n 是数组的长度。希望本文介绍的算法对你有帮助!

StVariable的博客 114

数组反转原理及实现

原理 定义一个新数组,让旧数组的值根据反向的下标添加进新数组。 举例 var arr = [1,2,3,4]; 这个问题考察的点在于如何获得旧数组反向的下标,涉及数组循环下标,首先考虑与arr.length的关系。 目前数组下标 0,1,2,3 需要获取下标 3,2,1,0 arr.length 4 循环条件 for(var i = 0; i < arr.length; i++) { console.log(i) // output: 0,1,2,3 } 根据上述已知条件 可以让arr.l

error 1053

python数据结构与算法2000讲 0033. 搜索旋转排序数组

python数据结构与算法2000讲 0033. 搜索旋转排序数组。

IT 甄选推荐 829

BZOJ4714: 旋转排列

就是对于每个错排,统计里面有多少种环长 考虑枚举环长L,可以用容斥计算不含长为L的环的方案数cLcLc_L,总数减去cLcLc_L就是贡献 cL=∑[n/L]i=0((niL)∏ij=2(jL−1L−1)((L−1)!)i)cL=∑i=0[n/L]((iLn)∏j=2i(L−1jL−1)((L−1)!)i)c_L=\sum_{i=0}^{[n/L]}( (^n_{iL})\prod_{j=2}...

L_0_Forever_LF的专栏 357

电阻应变式力传感器

电阻应变式力传感器

lu_fresh_student的博客 5073

JeecgBoot漏洞利用工具解析:一键getshell原理与安全加固实践

在应用安全领域,远程代码执行(RCE)和文件上传漏洞是Web系统面临的高危威胁,其核心原理在于对用户输入的控制不足或安全校验缺失。攻击者通过构造恶意请求,可绕过系统边界,在服务器上执行任意命令或上传恶意文件,从而获取系统控制权。这类漏洞的技术价值在于揭示了应用层安全防护的薄弱环节,其利用方式自动化、集成化趋势明显,极大地提升了攻击效率。在低代码开发平台等快速构建的业务系统中,此类风险尤为突出。应用场景广泛覆盖安全测试、渗透评估与应急响应。本文聚焦于JeecgBoot平台的历史高危漏洞,深入解析其SQL注入、

weixin_30787531的博客 551

算法-反转数组

思路:头和尾互换,遍历一半的次数。 class Solution { public void reverseString(char[] s) { for(int x=0;x<s.length/2;x++){ char temp= s[x]; s[x]=s[s.leng...

Chents 296

基于CatBoost回归模型的完整预测分析:从建模到SHAP可解释性分析

本文介绍了使用CatBoost回归模型进行完整预测分析的流程。首先导入必要的Python库并加载数据,进行数据预处理包括训练测试集划分和归一化处理。然后通过网格搜索优化CatBoost超参数,使用最优参数训练模型并评估预测性能。结果显示模型具有较高的决定系数(R²=0.9944)和较低的误差指标(RMSE=0.0696)。接着进行残差分析和正态性检验,发现残差基本服从正态分布。最后通过SHAP分析实现模型可解释性,识别关键特征影响。该方法为梯度提升树在回归问题中的应用提供了完整解决方案。

fx666_的博客 746

数据结构与算法之数组: LeetCode 344. 反转字符串 (Ts版)

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。2 ) 方案2: 双指针优化。1 ) 方案1:双指针。

Wang的专栏 476

YOLOv8【第十一章:视频追踪与流处理篇·第3节】匈牙利算法(Hungarian Algorithm)与 KM 算法匹配机制详解!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 443

使用STM32制作智能窗帘控制

以上就是一个简单的基于STM32的智能窗帘控制代码案例。通过感知光线强度和控制步进电机的旋转,我们可以实现智能窗帘的自动开启和关闭。通过定时器的中断来控制步进电机的旋转,从而实现窗帘的开启和关闭动作。最后,我们需要实现主函数和中断函数。在主函数中,我们需要初始化硬件资源,然后进入一个无限循环来不断检测光敏电阻的值,并根据其值来控制窗帘的开启和关闭。接下来,我们需要编写功能函数,用于控制窗帘的开启和关闭。然后,我们需要配置STM32开发环境,并创建一个新的工程。接下来,我们初始化相关的硬件资源。

2401_85258012的博客 276

Ts 数组的使用

数组的常用操作,增、删、改、查、置空、遍历、迭代、初始化、与字符串的相互转换、连接两个数组、查找符合条件的多个数组元素、判断该数组的所有元素或者单一元素是否符合某个条件等内容............

crazy_yun的博客 1万+

STM32入门教程:智能汽车控制

智能汽车是近年来快速发展的领域之一,它结合了嵌入式系统、传感器和通信技术,通过智能化的控制算法和决策系统实现自主导航、避障、环境感知等功能。在这篇教程中,我们将以 STM32 微控制器为核心,通过编写代码案例来介绍智能汽车的控制原理和实现方法。步骤三:决策与执行 最后,我们根据传感器数据做出相应的决策,并执行相应的动作。案例:智能汽车的避障功能 在这个案例中,我们将实现智能汽车的避障功能。感知系统负责感知汽车周围的环境,包括障碍物的距离、车辆的角度等信息。下面我们通过一个具体的案例来演示代码的编写。

2401_85258012的博客 927

算法题 搜索旋转排序数组

算法题 搜索旋转排序数组

红血哥 1508

倍福---EL2262模块飞拍配置

控制器安装了twincat3,用EL2262实现相机飞拍功能。本文档只介绍如何通过EL2262实现飞拍的触发,并不涉及视觉方面的处理 参考文章: https://author.baidu.com/home?from=bjh_article&app_id=1669190598708386 https://mp.weixin.qq.com/s/r4Iq8kOP-o4_M8vCce5M9g 1、 飞拍的应用 在大多数场合,只能当被检测工件和相机都处于静止状态下才能进行拍照,拍照完成后,再移动工件或相机,进

weixin_41883890的博客 3738

第一节:从Chat_Bot 到 AI_Agent——一个范式转换

本文系统剖析了工业级AI代理系统ClaudeCode的设计原理与工程实践。通过对比ChatBot与Agent的三个本质差异:自主循环决策vs单轮应答、环境交互vs纯文本I/O、持久状态管理vs无状态对话,揭示了构建生产级Agent系统的关键挑战。文章详细解析了ClaudeCode的五层架构设计、1800+文件组成的运行时系统,包括工具调度、权限管理、状态持久化等核心机制,并阐述了从简单API调用到完整Agent系统的演进路径。

2201_75869398的博客 67

【算法】搜索旋转排序数组

旋转排序数组是一个原本升序排列的数组,之后在其某个位置进行了旋转。例如,原数组旋转后可能变为。在此类数组中查找特定值,传统二分查找不再直接适用。本文通过对搜索旋转排序数组算法的探讨,不仅展现了C++在算法实现上的强大能力,还揭示了在特定数据结构上优化搜索策略的重要性。面对实际应用中的复杂数据分布,灵活运用和优化算法是提升系统性能的关键。未来,随着数据规模的不断增长,探索更加高效、适应性更强的搜索算法,将是算法研究领域的持续追求。

master_chenchen的博客 400

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

LeetCode 算法:搜索旋转排序数组 c++

LeetCode 算法:搜索旋转排序数组 c++

世界那么大,我想去看看~【随心更新,看世界去了😄】 971

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【每日一题 指尖算法】搜索旋转排序数组——开区间二分算法/旋转数组定位

解题思路 这道题要求在旋转后的有序数组中查找目标值,要求时间复杂度为O(log n)。由于数组局部有序,可以改进二分查找算法: 确定有序区间:每次二分时,检查中间元素,总有一半区间是有序的(左半或右半)。 判断目标位置:根据有序区间判断目标值是否在该区间内,从而缩小搜索范围: 若左半有序且目标在该区间,则搜索左半; 否则搜索右半; 同理处理右半有序的情况。 示例: 输入 [4,5,6,7,0,1,2],目标0: 中间7,左半有序但0不在[4,7),搜索右半。 中间0,找到目标。 复杂度:每次将搜索范围减半,

Layman的博客 475

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Python算法题集_搜索旋转排序数组

题目33. 搜索旋转排序数组:整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0

长孤秋落的札记 1212

算法面试_搜索旋转排序数组

题目:假设按照升序排序的数组在预先未知的某个点上进行旋转。 (例如,数组[0,1,2,3,4,5,6,7,8,9]变成[7,8,9,1,2,3,4,5,6])。 搜索一个给定的值,如果数组中存在这个目标值,则返回它的索引,否则返回-1。 我们可以假设数组中不存在重复元素。 算法时间复杂度必须是O(logn)级别。 下面我们用C++编写代码: class Solution{ public: int...

Rocky Ding相信人工智能、数据科学、商业逻辑、金融工具、终身成长以及顺应时代的潮流会赋予我们超能力。 351

算法:搜索旋转排序数组

leetcode 搜索旋转排序数组 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。 给你 旋转

weixin_46091073的博客 152

LeetCode算法 —— 搜索旋转排序数组

题目 : 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组?[0,1,2,4,5,6,7]?可能变为?[4,5,6,7,0,1,2]?)。 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回?-1?。 你可以假设数组中不存在重复的元素。 你的算法时间复杂度必须是?O(log?n) 级别。 二分探索(O(LogN)) #include <iostream> #include <stack> #include <algorithm&g

浪子花梦 440

算法_ 搜索旋转排序数组(js)

力扣 33. 搜索旋转排序数组 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组中不存在重复的元素。 你的算法时间复杂度必须是 O(log n) 级别。 示例一 输入: nums = [4,5,6,7,0,1,2], target = 0 输出: 4 示例二 输入: nums = [4,5,6,7,.

jx_zls的博客 316

【算法探险】解锁搜索旋转排序数组的JavaScript秘籍

通过本次探索,我们不仅掌握了搜索旋转排序数组的高效策略,还洞悉了算法背后的逻辑之美。未来,随着技术的不断演进,期待更多创新算法涌现,为解决复杂问题提供更多可能性。记住,算法之路无捷径,实践与思考是通往高手之路的不二法则。让我们一起,在编码的征途中,不断探索,不断前行!欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。DTcode7的博客首页。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 808

算法训练:搜索旋转排序数组

题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组中不存在重复的元素。 你的算法时间复杂度必须是 O(log n) 级别。 示例1: 输入: nums = [4,5,6,7,0,1,2], t...

wxy_66的博客 231
上一篇: 算法--移除元素
下一篇: 算法--下一个排列
CodersCoder
博客等级 码龄10年 90粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值