leetcode33. 搜索旋转排序数组

2023-11-15

整数数组 nums 按升序排列,数组中的值 互不相同 。

在传递给函数之前,nums 在预先未知的某个下标 k0 <= 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

因为题目要求的时间复杂度是 O(log n),所以我们不能用遍历数组的方法(O(n))

  由此我们可以想到使用二分查找的办法,这道题和普通的二分查找有区别的地方是前面会有一部分数组大于后面的数组,但这两部分数组本身都是有序数组。所以只要在比较mid和target的时候再多进行一下判断就可以了

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        if not nums:
            return -1
        l, r = 0, len(nums) - 1
        while l <= r:
            mid = (l + r) // 2
            if nums[mid] == target:
                return mid
            if nums[0] <= nums[mid]:
                if nums[0] <= target < nums[mid]:#target在l到mid之间的情况
                    r = mid - 1
                else:#target在mid到r之间
                    l = mid + 1
            else:
                if nums[mid] < target <= nums[len(nums) - 1]:##target在mid到r之间
                    l = mid + 1
                else:#target在l到mid之间的情况
                    r = mid - 1
        return r if r < len(nums) and nums[r] == target else -1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode33. 搜索旋转排序数组 的相关文章

随机推荐

  • Shell for&while 循环详细总结

    http www linuxidc com Linux 2012 02 53030 htm usr bin ksh 数字段形式 for i in 1 10 do echo i done 详细列出 字符且项数不多 for File in 1
  • Linux设置es程序开机自动启动

    编写开机启动脚本 bin sh chkconfig 2345 80 05 description elasticsearch jdk相关路径 export JAVA HOME var local java jdk1 8 0 241 expo
  • Windows10 - 如何开机自动启动邮件,如何开机启动指定应用

    打开文件夹 C ProgramData Microsoft Windows Start Menu Programs StartUp 如果没有就新建StartUp Windows会自动将StartUp识别为中文的 启动 然后从开始菜单 将邮件
  • Python&PyQt5报错:AttributeError: module 'PyQt5.QtGui' has no attribute 'QMainWindow'

    在学习Python的PyQt5时 遇到了第一个问题 AttributeError module PyQt5 QtGui has no attribute QMainWindow 代码如下 运行之后 出现如下错误 在https stackov
  • 第一章 初识Web

    前言 这部分我们将要了解到哪些前端内容 直接切入正题 对于Web前端 最基础的内容是 HTML CSS JavaScript三个东西 其中JavaScript是最为核心内容 如果说html和css决定一个前端工程师的下限 那么javascr
  • 宠物项目统计

    Override public StatisticsMemberAllResponse getStatisticsByRequest StatisticsMemberRequest request StatisticsMemberAllRe
  • 解决安卓悬浮窗异常:java.lang.IllegalArgumentException

    在开发安卓悬浮窗的过程中有可能会遇到这个异常 java lang IllegalArgumentException View not attached to window manager 原因 如果是在执行android view View
  • 用一个数组实现两个栈(共享栈)

    共享栈 一个数组实现两个栈 第一个栈是开头 第二个栈是结尾 用c语言实现 很简单 两个指针一个数组就够了 上代码 define CRT SECURE NO WARNINGS 1 include
  • Windows中从浏览器启动本地应用程序 Pluggable Protocol

    项目中需要从网页中打开一个本地应用程序 并传递给应用程序启动参数 方法有很多 最简单的一种是通过自定义协议 类似于mailto http https 主流浏览器都支持 只需要在注册表中添加相应内容即可 官方叫做 Pluggable Prot
  • 在CentOS 7中使用BIND部署DNS服务器 - 正向/反向解析

    DNS Domain Name System 域名系统 用于解析域名与IP地址的映射关系 根据主机名 域名 解析对应的IP地址称之为正向解析 根据IP地址解析对应的主机名 域名 称为之反向解析 DNS服务器又分为主服务器 从服务器和缓存服务
  • 进制转换成_10to16

    include math h void 10to16 char 10 char 16 int n n atoi 10 sprintf 16 x n main char 10 20 16 20 printf input 10 jinzhi n
  • QT 去掉标题栏和去掉标题栏后移动窗口

    转自 http www 2cto com kf 201302 191602 html 在用QT编写界面时 去掉标题栏方法比较简单 就一行代码 this gt setWindowFlags Qt FramelessWindowHint 去掉以
  • go 无限极分类实现 返回树状排列数据 或 树状层级数据

    根据从数据表中查询的多条数据得到树状数据 数据表中根据 id 与 pid进行区分上下级 具体实现如下 1 分类排列 Menu 菜单 type Menu struct Id int Pid int CateName string Desc s
  • go 关于redis包的依赖包go.opentelemetry.io/otel下载出现i/o timeout

    通过go get u v github com go redis redis对redis包进行添加 会出现i o timeout的错误 对于该依赖包的解决方法在百度查找不到 但是可以找到相关的网站 https opentelemetry i
  • 中文停用词

    一 数 日 0 1 2 3 4 5 6 7 8 9 lt gt gt gt A Lex exp sub sup
  • 专题详解-5G接入控制(1)

    相关文章会在公众号同步更新 公众号 5G通信大家学 持续更新的相关5G内容都是直接根据3GPP整理 保证更新内容的准确性 避免通过二手 甚至多手的资料 以讹传讹误导网友 最近工作中遇到了一些5G专网接入限制的问题 以前没仔细研究 借着解决这
  • angular路由参数路由跳转

    路由参数及跳转 本节介绍路由参数及跳转相关 准备工作 首先 我们需要将上一节的 CommentService UserService抽离成单独的文件 以便多处使用 ng g s components router study comment
  • Python入门_使用while循环计算1-100之间偶数和

    案例 计算1 100之间所有偶数的和 i 1 定义一个变量sum为0 用来存放和 sum 0 while i lt 100 每次sum和i相加 if i 2 0 sum i i 1 执行完之后 打印sum的值 print 1 100之间偶数
  • Nginx实现反向代理和负载均衡

    Nginx安装 本文章主要介绍下 如何使用Nginx来实现反向代理和负载均衡 Nginx安装和基础知识 可参考我的这篇文章 Nginx安装 Nginx实现反向代理 实现反向代理需要准备两台Nginx服务器 一台Nginx服务器A ip为 1
  • leetcode33. 搜索旋转排序数组

    整数数组 nums 按升序排列 数组中的值 互不相同 在传递给函数之前 nums 在预先未知的某个下标 k 0 lt k lt nums length 上进行了 旋转 使数组变为 nums k nums k 1 nums n 1 nums