LeetCode-33 - 搜索旋转排序数组

【中等】力扣算法题解析LeetCode33:搜索旋转排序数组 要求在旋转后的有序数组中查找目标值,要求时间复杂度为O(log n)。通过二分查找,每次判断左右两部分的有序性来确定目标值所在区间。若左半有序且目标值在左半范围内,则搜索左半;否则搜索右半。若未找到则返回-1。该方法高效利用了二分查找的特性,确保在旋转数组中快速定位目标值。 阅读详情

题目

来源: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] 。

给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,
则返回它的下标,否则返回 -1 。

示例 1:

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

示例 2:

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

示例 3:

输入:nums = [1], target = 0
输出:-1

提示:

  • 1 < = n u m s . l e n g t h < = 5000 1 <= nums.length <= 5000 1<=nums.length<=5000
  • − 1 0 4 < = n u m s [ i ] < = 1 0 4 -10^4 <= nums[i] <= 10^4 −104<=nums[i]<=104
  • n u m s nums nums 中的每个值都 独一无二
  • 题目数据保证 nums 在预先未知的某个下标上进行了旋转
  • − 1 0 4 < = t a r g e t < = 1 0 4 -10^4 <= target <= 10^4 −104<=target<=104

接下来看一下解题思路:

思路:二分法:

    这个题在数组里面寻找指定的值,并返回下标,可以通过 循环遍历 来查找,但是时间复杂度是 O(n)。

    二分查找适用场景:有序或者部分有序,基本使用二分搜索及其变种;
    因为每次搜索数据的一半,时间复杂度 O ( l o g n ) O(logn) O(logn)

    将数组从中间分开成左右两部分的时候,一定有一部分的数组是有序的。
    拿示例来看,我们从 6 6 6 这个位置分开以后数组变成了 [ 4 , 5 , 6 ] [4, 5, 6] [4,5,6] 和 [ 7 , 0 , 1 , 2 ] [7, 0, 1, 2] [7,0,1,2] 两个部分,其中左边 [ 4 , 5 , 6 ] [4, 5, 6] [4,5,6] 这个部分的数组是有序的,其他也是如此。

    可以在常规二分查找的时候查看当前 m i d mid mid 为分割位置分割出来的两个部分 [ l e f t , m i d ] [left, mid] [left,mid] 和 [ m i d + 1 , r i g h t ] [mid + 1, right] [mid+1,right] 哪个部分是有序的,并根据有序的那个部分确定该如何改变二分查找的上下界,因为能够根据有序的那部分判断出 t a r g e t target target 在不在这个部分:

  • 如果 [ l e f t , m i d − 1 ] [left, mid - 1] [left,mid−1] 是有序数组,且 t a r g e t target target 的大小满足 [ nums [ l e f t ] , nums [ m i d ] ) [\textit{nums}[left],\textit{nums}[mid]) [nums[left],nums[mid]),则应该将搜索范围缩小至 [ l e f t , m i d − 1 ] [left, mid - 1] [left,mid−1],否则在 [ m i d + 1 , r i g h t ] [mid + 1, right] [mid+1,right] 中寻找。
  • 如果 [ m i d , r i g h t ] [mid, right] [mid,right] 是有序数组,且 t a r g e t target target 的大小满足 ( nums [ m i d + 1 ] , nums [ r i g h t ] ] (\textit{nums}[mid+1],\textit{nums}[right]] (nums[mid+1],nums[right]],则我们应该将搜索范围缩小至 [ m i d + 1 , r i g h t ] [mid + 1, right] [mid+1,right],否则在 [ l e f t , m i d − 1 ] [left, mid - 1] [left,mid−1] 中寻找。

在这里插入图片描述
如果 target = 5, 在 [left, mid - 1] 中寻找;
如果 target = 2, 在 [mid + 1, right] 中寻找;
在这里插入图片描述
如果 target = 6, 在 [left, mid - 1] 中寻找;
如果 target = 4, 在 [mid + 1, right] 中寻找;

public static int search(int[] nums, int target) {
    int n = nums.length;
    if (n < 1) {
        return -1;
    }

    if (n == 1) {
        return nums[0] == target ? 0 : -1;
    }

    int left = 0, right = n - 1;

    while (left <= right) {
        int mid = (left + right) >> 1;
        if (target == nums[mid]) {
            return mid;
        }
        // 说明左边是有序的
        if (nums[0] <= nums[mid]) {
            // 目标值在左侧序列
            if (nums[0] <= target && target < nums[mid]) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
            // 右边是有序的
        } else {
            if (nums[mid] < target && target <= nums[n - 1]) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
    }
    return -1;
}
复杂度分析

时间复杂度: O ( log ⁡ n ) O(\log n) O(logn),其中 n n n 为 nums \textit{nums} nums 数组的大小。整个算法时间复杂度即为二分查找的时间复杂度 O ( log ⁡ n ) O(\log n) O(logn)。
空间复杂度: O ( 1 ) O(1) O(1)。只需要常数级别的空间存放变量。

EMC辐射发射测试:垂直与水平极化测试原理与实战指南 电磁兼容(EMC)测试是确保电子设备在复杂电磁环境中稳定运行的关键环节,其核心在于评估设备产生的电磁干扰(EMI)强度。辐射发射测试作为EMC测试的重要组成部分,通过测量设备向空间辐射的电磁噪声,判断其是否符合国际标准限值。测试原理基于电磁波的极化特性,即电场矢量的振动方向,主要分为垂直极化和水平极化。理解极化特性对于精准定位辐射源、高效进行EMC整改具有重要技术价值。在工程实践中,垂直极化噪声通常源于线缆辐射等垂直结构,而水平极化噪声多来自PCB走线等水平结构。通过分别测量两种极化方向的辐射最大值,可以全 阅读详情

相关推荐

模电专题-MOS管的放大电路分析

在实际应用中,我们经常会使用到功率MOS,这时通常不会将它当成一个开关使用,而是当成一个放大器来使用,那这就需要让其工作在放大状态。参考下图中的mos管的特性曲线,右图中的输出特性曲线中有一根红色的分界线,这个线就是区分mos管工作状态的分界线,在红线的左边,mos管工作在可变电阻区,也就是线性区;在红线的右边mos管工作在恒流区,也就是饱和区。当然,还有一个截止区。本文分析主要运用模电课本中的理论计算验证。

Anitawen的博客 2万+

leetcode:33. 搜索旋转排序数组

对于旋转数组,nums=[4,5,6,7,0,1,2]

OceanStar的博客 1010

R语言基础之R语言入门

R语言最初是由新西兰奥克兰大学统计系的教授Ross Ihaka和Robert Gentleman在S语言基础上开发完成的。是一门解释性语言。在我看来R语言是一门数学性极强的语言,或者说这是一门为数学而生的语言,因为其具有极其出色的计算与统计分析能力...

weixin_46912400的博客 5万+

LeetCode 33——搜索旋转排序数组

1. 题目 2. 解答 2.1. 方法一 直接进行二分查找,在判断查找方向的时候详细分类。 当 nums[mid] < target 时, 若 nums[left] <= nums[mid],此时,target 一定在nums[mid] 右边,继续向右查找。 若 nums[left] > nums[mid] &lt...

weixin_33898876的博客 438

别再折腾端口了!Kali Nethunter Kex 图形化桌面连接失败的真正原因与一键修复(附Termux命令)

本文深入分析了Kali Nethunter Kex图形化桌面连接失败的真正原因,包括端口配置变更、依赖缺失和权限问题,并提供了一键修复方案和Termux命令。通过详细的诊断步骤和优化配置,帮助用户快速恢复Kex功能,提升移动安全测试效率。

weixin_42530732的博客 416

案例分析|一篇文章带你看懂养鸡场智慧管理系统

养鸡场智慧管理系统是为了满足现代化养鸡业对精细化管理的需求而设计的一款专业软件。随着科技的发展和农业产业的升级,传统的手工记录和管理方式已无法满足高效、准确和实时的数据跟踪需求。本软件旨在通过集成各种功能模块,帮助养鸡场主实现从鸡苗孵化、饲养管理、饲料控制到销售结算等全链条的智能化操作。该系统的核心目标是提升养鸡场的运营效率和盈利能力,通过自动化数据处理,减少人工误差,节省时间和精力。例如,孵化报表和记录模块可以帮助管理者实时监控孵化过程,及时调整策略;

muyu2980的专栏 930

LeetCode第33题解析

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

blue_coffeei的博客 1335

【vLLM-性能洞察】基于Ascend Profiler的端到端推理瓶颈定位与优化实践

本文详细介绍了如何利用Ascend Profiler对vLLM-Ascend大模型推理服务进行端到端的性能瓶颈定位与优化。通过实战案例,阐述了从数据采集、可视化分析到诊断低效算子、内存管理、计算通信重叠及框架调度等常见瓶颈的全过程,为基于昇腾NPU的AI推理性能调优提供了系统性的方法论和实用工具指南。

cc789的博客 519

Leetcode算法题:旋转数组问题(全)总结 思路+题解+代码

旋转数组问题 标签:二分查找,翻转数组 题目:189.旋转数组 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 进阶: 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗? 示例 1: 输入: nums = [1,2,3,4,5,6,7], k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,

Q540670228的博客 6582

华为服务器RAID配置避坑指南:如何通过iBMC快速识别阵列卡型号并完成初始化

本文详细解析华为服务器RAID配置全流程,重点介绍通过iBMC快速识别阵列卡型号、硬盘健康诊断及RAID级别选择的场景化策略。提供从iBMC登录到缓存策略调优的实战技巧,帮助工程师避免常见配置陷阱,提升服务器存储系统性能和稳定性。

weixin_28475533的博客 490

MOLDFLOW 2012模流分析基础到实战视频教程

├ 1第一讲MF软件安装与界面定制及模流前期准备工作及分析流程介绍 ├ 2第二讲MF建模工具条命令讲解与图层的运用 ├ 3第三讲MF网格类型与适应范围及网格划分、诊断、修复与统计 ├ 4第四讲MF中CAD doctor 模块对导入模型的修复方法与实例 ├ 5第五讲MF中常见各种流道浇口及水路的建模方法与外部导入方法上 ├ 6第六讲MF产品模型导入CAD DOCTOR与修复 ├ 7第七讲MF分析序列设定与网格的划分与诊断及修复 ├ 8第八讲MF材料选择与成型工艺参数设定 ├ 9第九讲MF创建浇注系统:主流道、

QQ_1987083845的博客 2543

(LeetCode)搜索旋转排序数组——二分法

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

简十三的博客 2260

用python提取PDF中各类文本内容的方法

用python提取PDF中各类文本内容的方法

安静的软件工程师 6083

【力扣LeetCode】33 搜索旋转排序数组

题目描述(难度中) 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [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,...

Jiewang的博客 336

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

33. 搜索旋转排序数组 - 力扣(LeetCode)

整数数组nums按升序排列,数组中的值。在传递给函数之前,nums在预先未知的某个下标k)上进行了,使数组变为(下标计数)。例如,在下标3处经旋转后可能变为。给你的数组nums和一个整数target,如果nums中存在这个目标值target,则返回它的下标,否则返回-1。你必须设计一个时间复杂度为O(log n)的算法解决此问题。输入:nums = [4,5,6,7,0,1,2], target = 0输出:4输入:nums = [4,5,6,7,0,1,2], target = 3。

Dubhehug的博客 1190

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

leetcode力扣33.搜索旋转排序数组

题目: 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [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], tar

LifeGoesOn 220

LeetCode33-搜索旋转排序数组

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

lyd1995的博客 434

LeetCode 33:搜索旋转排序数组(Java实现)

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

qq_45093368的博客 386

LeetCode 33 搜索旋转排序数组

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

weixin_37905795的博客 175

LeetCode 33搜索旋转排序数组

LeetCode 33搜索旋转排序数组 题目简述:假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。 输入:nums = [4,5,6,7,0,1,2], target = 0 输出:4 输入:nums = [4,5,6,7,0,1,2], target = 3

XBlog 184

#力扣 LeetCode33. 搜索旋转排序数组 @FDDLC

题目描述: 33. 搜索旋转排序数组 - 力扣(LeetCode) (leetcode-cn.com) Java代码: class Solution { public int search(int[] a, int t) { for(int i=0;i<a.length;i++)if(a[i]==t)return i; return -1; } } ...

LiuXingchang的博客 387

《LeetCode力扣练习》第33题 搜索旋转排序数组 Java

《LeetCode力扣练习》第33题 搜索旋转排序数组 Java 一、资源 题目: 整数数组 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 处经旋转后可

XRT_knives的博客 398

LeetCode33 搜索旋转排序数组(Java实现)

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

大白菜的博客 364

力扣第33题:搜索旋转排序数组

此算法利用旋转数组的一部分总是有序的性质,通过二分查找和分段判断有效缩小搜索范围,最终实现高效搜索。

weixin_48941116的博客 664

Leetcode 33. 搜索旋转排序数组 C++

Leetcode 33. 搜索旋转排序数组 题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [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 = [

weixin_43750513的博客 473

leetcode33.搜索旋转排序数组-medium

在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2]。输入:nums = [4,5,6,7,0,1,2], target = 0。输入:nums = [4,5,6,7,0,1,2], target = 3。

weixin_37253733的博客 733
上一篇: LeetCode-32 - 最长有效括号
下一篇: LeetCode-34 - 在排序数组中查找元素的第一个和最后一个位置
CodAlun
博客等级 码龄8年 46粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值