33.搜索旋转排序数组 python

LeetCode题解:33.搜索旋转排序数组【Python题解超详细,二分查找法、index方法】,知识拓展:搜索排序数组、带重复元素的排序数组 LeetCode题解:33.搜索旋转排序数组【Python题解超详细,二分查找法、index方法】,知识拓展:搜索排序数组、带重复元素的排序数组 搜索旋转排序数组:给你旋转后的数组nums和一个整数target,如果nums中存在这个目标值target,则返回它的下标,否则返回-1。你必须设计一个时间复杂度为O(log n)的算法解决此问题。 阅读详情

题目

题目描述

整数数组 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 。

你必须设计一个时间复杂度为 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

示例 3:

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

提示:

1 <= nums.length <= 5000
-10^4 <= nums[i] <= 10^4
nums 中的每个值都 独一无二
题目数据保证 nums 在预先未知的某个下标上进行了旋转
-10^4 <= target <= 10^4

题目链接

搜索旋转排序数组

题解

解题思路

这个问题可以通过修改二分查找算法来解决。由于数组是经过旋转的有序数组,我们不能直接使用标准的二分查找,但是我们可以利用数组的特性来进行调整。具体来说,通过检查中间点与边界的关系,我们可以确定哪一半是有序的,并据此决定在哪个半区进行下一步搜索。

以下是具体的步骤:

  1. 初始化:设置两个指针 left 和 right 分别指向数组的起始和结束位置。
  2. 循环条件:当 left <= right 时继续循环。
  3. 计算中间点:计算中间点 mid 的索引。
  4. 检查中间点:如果 nums[mid] 等于目标值 target,则返回 mid。
  5. 判断哪边有序:
    • 如果左半部分有序(即 nums[left] <= nums[mid]),检查目标值是否在这个范围内。如果是,则调整 right 到 mid - 1;否则,调整 left 到 mid + 1。
    • 否则,右半部分有序(即 nums[mid] < nums[right]),检查目标值是否在这个范围内。如果是,则调整 left 到 mid + 1;否则,调整 right 到 mid - 1。
  6. 未找到目标值:如果循环结束后仍未找到目标值,则返回 -1。

python实现

下面是 Python 实现代码:

def search(nums, target):
    left, right = 0, len(nums) - 1
    
    while left <= right:
        mid = (left + right) // 2
        
        if nums[mid] == target:
            return mid
        
        # Check if left part is sorted
        if nums[left] <= nums[mid]:
            if nums[left] <= target < nums[mid]:
                right = mid - 1
            else:
                left = mid + 1
        # Otherwise, the right part must be sorted
        else:
            if nums[mid] < target <= nums[right]:
                left = mid + 1
            else:
                right = mid - 1
                
    return -1

代码解释:

  • 初始化:设置 left 和 right 指针。
  • 循环条件:确保我们在有效的范围内进行搜索。
  • 计算中间点:避免溢出,使用 (left + right) // 2 计算 mid。
  • 检查中间点:如果找到了目标值,立即返回其索引。
  • 判断哪边有序:根据中间点与左右边界的比较,确定哪一部分是有序的,并进一步缩小搜索范围。
  • 未找到目标值:如果循环结束还没有找到目标值,说明目标不在数组中,返回 -1。

这种方法的时间复杂度为 O(log n),因为它基于二分查找的思想,在每次迭代中将搜索空间减半。

提交结果

在这里插入图片描述

Leetcode 33 搜索旋转排序数组 思路详解+反思总结 python实现 本人一直在努力地积累Leetcode上用Python实现的题,并且会尽力讲清每道题的原理,绝不像其他某些博客简略地带过。如果觉得讲的清楚,欢迎关注。题目:假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中... 阅读详情

相关推荐

4 种方法识别Linux系统 USB 设备

导读 如果在系统中插入一个设备,尤其是在桌面环境下,比如 USB 设备,它会自动挂载到一个指定目录,一般是在 /media/username/device-label 目录下,之后你就可以进入到该目录下访问那些文件了。然而,在服务器上就不是这么回事了,你必须手动挂载这个设备,并且指定一个挂载点。 查询USB设备 Linux 系统使用 /dev 目录下特定的设备文件来标识插入的

郑帅的博客 1986

leetcode(33)---搜索旋转排序数组(二分查找)

文章目录一、题目二、题解 一、题目 33.搜索旋转排序数组 整数数组 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,

叶卡捷琳堡的博客 423

在Ubuntu 22.04上搞定CanFestival主站:从源码下载到SocketCAN配置的保姆级教程

本文提供在Ubuntu 22.04上配置CanFestival主站的详细教程,涵盖从源码下载、SocketCAN配置到实战测试的全过程。针对工业自动化领域的CANopen协议需求,介绍如何优化编译环境、解决常见问题,并通过虚拟CAN接口验证功能完整性。

weixin_29192365的博客 404

Leetcode 33、搜索旋转数组

Leetcode 33、搜索旋转数组

hljjaaa的博客 186

APK静态分析(取证角度)——理论部分

APP是指应用程序(Application),是指能够在手机、平板电脑、电脑等移动设备上运行的软件。APP可以帮助用户进行各种功能操作,如社交媒体、游戏、购物、学习、工作等。用户可以通过应用商店或者在线下载安装APP,然后在设备上使用它们。APP的种类非常丰富,能够满足用户不同的需求和兴趣。

currify的博客 3208

深度残差网络的无人机多目标识别

深度残差网络的无人机多目标识别 人工智能技术与咨询 来源:《图学学报》。作者翟进有等 摘要:传统目标识别算法中,经典的区域建议网络(RPN)在提取目标候选区域时计算量大,时间复杂度较高,因此提出一种级联区域建议网络(CRPN)的搜索模式对其进行改善。此外,深层次的卷积神经网络训练中易产生退化现象,而引入残差学习的深度残差网络(ResNet),能够有效抑制该现象。对多种不同深度以及不同参数的网络模型进行研究,将两层残差学习模块与三层残差学习模块结合使用,设计出一种占用内存更小、时间复杂度更低的新型多捷.

m0_62870606的博客 3113

Python3实现旋转数组的3种算法

因为 k 可能大于 nums 的长度(当这两者相等的时候,就相当于 nums 没有移动),所以我们取 k % len(nums),k 和 nums 的长度取余,就是最终我们需要移动的位置。先把 nums 复制到 old_nums ,然后 nums 中索引为 x 的元素移动 k 个位置后,当前索引为 x+k,其值为 old_nums[x]。输入: [1,2,3,4,5,6,7] 和 k = 3。向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 3 步: [5,6,7,1,2,3,4]

xiaoyaozi2020的博客 431

PLSQL Developer新手必看:如何避免安装过程中的常见坑

本文为PL/SQL Developer新手提供了详尽的安装与配置避坑指南。从版本选择、注册码使用、汉化包安装到Oracle客户端连接配置,逐一解析常见问题并提供解决方案,帮助开发者快速搭建稳定的PL/SQL开发环境,顺利开启Oracle数据库编程工作。

g9h0i1的博客 653

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

在传递给函数之前,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。

xuxu96 752

基于 Simulink 的 PFC + LLC 级联系统联合仿真与优化实战教程

摘要:本教程详细介绍了2kW级AC-DC变换器建模方法,采用"BoostPFC+LLC谐振变换器"组合架构。重点解析了双级系统的核心控制策略:前级BoostPFC实现功率因数校正(PF>0.95),后级LLC通过变频调制(PFM)实现高效能量传输。教程包含四大关键步骤:PFC建模与控制、LLC参数计算与实现、母线电容优化设计以及系统联合调试,特别针对级联系统常见的母线电容震荡问题提供了解决方案。同时给出了仿真波形分析指南和避坑建议,包括代数环处理、仿真步长设置等实用技巧,为新能源车

MHD0815的博客 120

【LIN总线测试】——LIN主节点物理层测试

LIN总线是基于UART/SCI(通用异步收发器/串行接口)的低成本串行通讯协议。其目标定位于车身网络模块节点间的低端通信,主要用于智能传感器和执行器的串行通信,而这正是CAN总线的带宽和功能所不要求的部分。本章节主要介绍LIN主节点物理层如何测试?

测试领域技术分享 5531

python每日一题 搜索旋转排序数组

所以需要修改思路 首先判断哪部分是有序的 然后再进行查找 最终正确的是代码三 就是首先既然是旋转 那么就是从某点分割 左右两段是有序的 所以应该首先确定哪段是有序的 然后再根据比较Mid的值和所要找的值是不是在那一段 不用担心会出现乱的情况 代码一直都在判断是否有序 一直在分段 在有序的那部分 看看target在不在里面 不在就去另外半部分找。因为我确定这段是有序的 所以我理所当然地可以用这段的开始和结尾部分去判断target在不在这部分里面 这是个分有序的重点。按升序排列,数组中的值。

m0_62653520的博客 856

R语言dplyr包recode函数、recode_factor函数数值或因子替换实战

R语言dplyr包recode函数、recode_factor函数数值或因子替换实战 目录 R语言dplyr包recode函数、recode_factor函数数值或因子替换实战 #导入dplyr包 #recode函数进行数值替换 #recode_factor函数对因子变量进行替换 #导入dplyr包 install.packages("dplyr") # Install & load dplyr library("dpl.

data+scenario+science+insight 1592

leetcode 33. 搜索旋转排序数组(python)

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

lingjing2的博客 461

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

精雕软件(JDpaint) 5.5 绿色版

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

LeetCode 33. 搜索旋转排序数组 | Python

使用二分查找的思想,解决《33. 搜索旋转排序数组》问题

"大梦三千秋的博客 746

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【LeetCode33】 搜索旋转排序数组 | Python实现 | Java实现

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

qq_35764460的博客 305

Statistics and Machine Learning Toolbox

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

LeetCode 33 搜索旋转排序数组 Python

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

Tianchi_M的博客 824

LeetCode-Python-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...

Keep Coding 1723

千问 LeetCode 33. 搜索旋转排序数组 Python3实现

LeetCode 33 搜索旋转排序数组的 Python3 实现核心在于改造二分查找:每次二分后,至少有一半是有序的,先判断哪半有序,再判断 target 是否在有序区间内,时间复杂度 O(log n)。算法思路旋转排序数组的特点是:二分后至少有一半是有序的。Python3 代码实现执行流程图解以 nums = [4,5,6,7,0,1,2], target = 0 为例:第一轮:left=0, right=6, mid=34 <= 7 → 左半有序 [4,5,6,7]

m0_37843156的博客 70

33.搜索旋转排序数组--python

题:假设按照升序排序的数组在预先未知的某个点进行了旋转,给定一个目标值,如果数组中存在这个目标值,返回它的索引,否则返回-1,数组中不存在重复元素 法:这题木有重复元素,所以不存在nums[mid]既等于nums[left]又等于nums[right]的情况。数组在某个位置进行旋转,那么整个数组分成了两个递增的数组,比如nums=[4,5,6,7,0,1,2],前后数组都是单调增的。根据nums...

karen17的博客 634

LeetCode第33题:搜索旋转排序数组【python】

理解数组的分段有序性是解决问题的关键,本题的解法不仅适用于旋转排序数组,也加深了对二分查找应用的理解

10年数据\经营分析经验,现任大厂数据分析负责人 1071

leetcode的python实现-33 搜索旋转排序数组

leetcode的python实现-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: 输入:

wu2020的博客 248

利用python 完成leetcode33搜索旋转排序数组

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

找到工作之前一天十篇的博客 383

leetcode 33.搜索旋转排序数组(python)

leetcode 33.搜索旋转排序数组(python) 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [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: 输入: num

pureszgd的博客 217

python旋转排序数组_LeetCode 33. 搜索旋转排序数组 | Python

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,...

weixin_39956110的博客 236

LeetCode题解(python)-33. 搜索旋转排序数组

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

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gxls2024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值