33. 搜索旋转排序数组

33. 搜索旋转排序数组

关键思路

  1. 使用二分查找
  2. 判断有序区间,t > nums[end] 左边是有序的,t <= nums[end] 右边是有序的
  3. 判断目标值 target,在有序区间还是非有序区间

题目

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

示例 3:

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

提示:

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

解题思路

这道题目要求在旋转后的有序数组中查找目标值。旋转后的有序数组是指一个原本有序的数组在某个点进行了旋转,例如 [4, 5, 6, 7, 0, 1, 2] 是由 [0, 1, 2, 4, 5, 6, 7] 旋转得到的。我们需要在这样的数组中高效地查找目标值。

1. 理解问题
  • 输入:一个旋转后的有序数组 nums 和一个目标值 target

  • 输出:目标值在数组中的索引,如果不存在则返回 -1

2. 分析数组特点

旋转后的数组虽然整体不是有序的,但它可以被分为两个部分,每一部分都是有序的。例如,[4, 5, 6, 7, 0, 1, 2] 可以分为 [4, 5, 6, 7] 和 [0, 1, 2],这两部分都是有序的。

3. 二分查找的适用性

二分查找通常用于有序数组,但在这里我们可以利用旋转数组的部分有序性来应用二分查找。关键在于如何判断目标值位于哪一部分。

4. 算法步骤
  • 初始化:设置两个指针 start 和 end,分别指向数组的起始和末尾。

  • 循环条件:当 start <= end 时,继续查找。

  • 中间值:计算中间索引 i = (start + end) // 2,并获取中间值 t = nums[i]

  • 判断中间值

    • 如果 t == target,直接返回 i

    • 如果 t > nums[end],说明左半部分是有序。此时如果 nums[start] <= target < t,则目标值在左半部分,否则在右半部分。

    • 如果 t <= nums[end],说明右半部分是有序。此时如果 t < target <= nums[end],则目标值在右半部分,否则在左半部分。

  • 更新指针:根据上述判断,更新 start 或 end 指针,缩小查找范围。

  • 返回结果:如果循环结束仍未找到目标值,返回 -1

5. 代码实现
# 二分查找
# https://leetcode.cn/problems/search-in-rotated-sorted-array
from typing import Listclass Solution:def search(self, nums: List[int], target: int) -> int:start = 0end = len(nums) - 1while start <= end:i = (start + end) // 2t = nums[i]if t == target:return iif t > nums[end]:# 当 t > nums[end]时,且 nums[start] <= target < t  左边元素一定是顺序if nums[start] <= target < t:end = i - 1else:start = i + 1else:# 当 t < nums[end]时,且 t < target <= nums[end] 右边元素一定是顺序if t < target <= nums[end]:start = i + 1else:end = i - 1return -1if __name__ == '__main__':s = Solution()r = s.search([4, 5, 6, 7, 0, 1, 2], 0)print(r)r = s.search([4, 5, 6, 7, 0, 1, 2], 3)print(r)r = s.search([1], 0)print(r)r = s.search([1, 3], 0)print(r)r = s.search([5, 1, 3], 5)print(r)r = s.search([1, 3], 3)print(r)r = s.search([3, 5, 1], 3)print(r)r = s.search([4, 5, 6, 7, 8, 1, 2, 3], 8)print(r)r = s.search([5, 1, 3], 3)print(r)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/14884.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python Pandas(5):Pandas Excel 文件操作

Pandas 提供了丰富的 Excel 文件操作功能&#xff0c;帮助我们方便地读取和写入 .xls 和 .xlsx 文件&#xff0c;支持多表单、索引、列选择等复杂操作&#xff0c;是数据分析中必备的工具。 操作方法说明读取 Excel 文件pd.read_excel()读取 Excel 文件&#xff0c;返回 DataF…

查看云机器的一些常用配置

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes常…

网站改HTTPS方法

默认的网站建设好后打开的样子那看起来像是钓鱼网站&#xff0c;现在的浏览器特别只能&#xff0c;就是你新买来的电脑默认的浏览器同样也会出现这样“不安全”提示。 传输协议启动了向全球用户安全传输网页内容的流程。然而&#xff0c;随着HTTPS的推出&#xff0c;传输协议通…

ssti学习笔记(服务器端模板注入)

目录 一&#xff0c;ssti是什么 二&#xff0c;原理 所谓模板引擎&#xff08;三列&#xff0c;可滑动查看&#xff09; 三&#xff0c;漏洞复现 1&#xff0c;如何判断其所属的模板引擎&#xff1f; 2&#xff0c;判断清楚后开始注入 &#xff08;1&#xff09;Jinja2&a…

解决基于FastAPI Swagger UI的文档打不开的问题

基于FastAPI Swagger UI的文档链接/docs和/redoc在没有外网的状态下无法打开&#xff0c;原因是Swagger依赖的JS和CSS来自CDN。 https://cdn.jsdelivr.net/npm/swagger-ui-dist5/swagger-ui-bundle.js https://cdn.jsdelivr.net/npm/swagger-ui-dist5/swagger-ui.css https://…

07苍穹外卖之redis缓存商品、购物车(redis案例缓存实现)

课程内容 缓存菜品 缓存套餐 添加购物车 查看购物车 清空购物车 功能实现&#xff1a;缓存商品、购物车 效果图&#xff1a; 1. 缓存菜品 1.1 问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压…

UML学习

定义&#xff1a;UML是一种用于软件系统分析和设计的标准化建模语言。 作用&#xff1a;用于描述系统的结构、行为、交互等。共定义了10种,并分为4类 ①用例图 user case diagram : 从外部用户的角度描述系统的功能,并指出功能的执行者. 静态图(②类图 class diagram ③,对象…

ChatGPT提问技巧:行业热门应用提示词案例-文案写作

ChatGPT 作为强大的 AI 语言模型&#xff0c;已经成为文案写作的得力助手。但要让它写出真正符合你需求的文案&#xff0c;关键在于如何与它“沟通”&#xff0c;也就是如何设计提示词&#xff08;Prompt&#xff09;。以下是一些实用的提示词案例&#xff0c;帮助你解锁 ChatG…

w~Transformer~合集5

我自己的原文哦~ https://blog.51cto.com/whaosoft/12406495 #transformer~x1 太可怕了都到6了 太强~~ DeepMind 表示&#xff0c;他们提出的算法蒸馏&#xff08;AD&#xff09;是首个通过对具有模仿损失的离线数据进行顺序建模以展示上下文强化学习的方法。同时基于观察…

视频采集卡接口

采集卡的正面有MIC IN、LINE IN以及AUDIO OUT三个接口&#xff0c; MIC IN为麦克风输入&#xff0c;我们如果要给采集到的视频实时配音或者是在直播的时候进行讲解&#xff0c;就可以在这里插入一个麦克风&#xff0c; LINE IN为音频线路输入&#xff0c;可以外接播放背景音乐…

【Linux】29.Linux 多线程(3)

文章目录 8.4 生产者消费者模型8.4.1 为何要使用生产者消费者模型8.4.2 生产者消费者模型优点 8.5 基于BlockingQueue的生产者消费者模型8.5.1 C queue模拟阻塞队列的生产消费模型 8.6. 为什么pthread_cond_wait 需要互斥量?8.7 条件变量使用规范8.8 条件变量的封装8.9 POSIX信…

【漫话机器学习系列】084.偏差和方差的权衡(Bias-Variance Tradeoff)

偏差和方差的权衡&#xff08;Bias-Variance Tradeoff&#xff09; 1. 引言 在机器学习模型的训练过程中&#xff0c;我们常常面临一个重要的挑战&#xff1a;如何平衡 偏差&#xff08;Bias&#xff09; 和 方差&#xff08;Variance&#xff09;&#xff0c;以提升模型的泛…

OpenCV:视频背景减除

目录 简述 1. MOG &#x1f537;1.1 主要特点 &#x1f537;1.2 代码示例 &#x1f537;1.3 运行效果 2. MOG2 &#x1f537;2.1 主要特点 &#x1f537;2.2 代码示例 &#x1f537;2.3 运行效果 3. KNN 4. GMG 5. CNT 6. LSBP 7. 如何选择适合的接口&#xff…

【SpringBoot篇】基于Redis分布式锁的 误删问题 和 原子性问题

文章目录 ??Redis的分布式锁??误删问题 ??解决方法??代码实现 ??原子性问题 ??Lua脚本 ?利用Java代码调用Lua脚本改造分布式锁??代码实现 ??Redis的分布式锁 Redis的分布式锁是通过利用Redis的原子操作和特性来实现的。在分布式环境中&#xff0c;多个应用…

计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas)

计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas) 文章目录 计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas)摘要Abstract一、Attention U-Net1. 基本思想2. Attention Gate模块3. 软注意力与硬注意力4. 实验…

Unity笔试常考

线程同步的几种方式 1.信号量pv操作 2.互斥加锁 3.条件变量 五层网络协议指的是哪五层 1.应用层 2.运输层 3.网络层 4.链路层 5.物理层 TCP和UDP区别 tcp 面向连接&#xff0c;保证发送顺序&#xff0c;速度慢&#xff0c;必须在线&#xff0c;三次握手&#xff0c;4次挥手…

Docker数据卷管理及优化

一、基础概念 1.docker数据卷是一个可供容器使用的特殊目录&#xff0c;它绕过了容器的文件系统&#xff0c;直接将数据存在宿主机上。 2.docker数据卷的作用&#xff1a; 数据持久化&#xff1a;即使容器被删除或重建数据卷中的数据仍然存在 数据共享&#xff1a;多个容器可以…

【AIGC】冷启动数据与多阶段训练在 DeepSeek 中的作用

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;冷启动数据的作用冷启动数据设计 &#x1f4af;多阶段训练的作用阶段 1&#xff1a;冷启动微调阶段 2&#xff1a;推理导向强化学习&#xff08;RL&#xff0…

Qt:项目文件解析

目录 QWidget基础项目文件解析 .pro文件解析 widget.h文件解析 widget.cpp文件解析 widget.ui文件解析 main.cpp文件解析 认识对象模型 窗口坐标系 QWidget基础项目文件解析 .pro文件解析 工程新建好之后&#xff0c;在工程目录列表中有⼀个后缀为 ".pro" …

BiGRU双向门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据)

代码地址&#xff1a;BiGRU双向门控循环单元多变量多步预测&#xff0c;光伏功率预测&#xff08;Matlab完整源码和数据) BiGRU双向门控循环单元多变量多步预测&#xff0c;光伏功率预测 一、引言 1.1、研究背景和意义 随着全球对可再生能源需求的不断增长&#xff0c;光伏…