33. 搜索螺旋数组

news/2024/9/19 17:09:28/文章来源:https://www.cnblogs.com/CharlseGo/p/18420970

题目描述:

整数数组 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. 数组的某一部分是升序排列的,但另一部分因为旋转的原因可能并不是升序排列。
  2. 通过找到旋转点,我们能够把数组划分成两个部分,一部分是递增的,另一部分在旋转后也保持递增但次序不同。

在这种情况下,传统的二分查找算法无法直接使用,因为整个数组并不是完全有序的。不过,可以通过观察发现,每次将数组一分为二时,总有一部分是有序的,这是我们可以利用的特性。

思路分析

  1. 确定二分查找的基础:二分查找的核心是在每一步将搜索空间减半。我们每次通过将数组分成两部分,分别检查目标值是否在其中一部分的有序区间内,从而决定搜索的方向。

  2. 如何判断哪部分是有序的:

    • 每次通过比较 nums[left] 和 nums[mid] 来判断左半部分是否有序。
    • 如果 nums[left] <= nums[mid],则说明左半部分是有序的。因为旋转不会影响这一部分,nums[left] 到 nums[mid] 保持递增。
    • 否则,右半部分一定是有序的,即 nums[mid] <= nums[right]。
  3. 在有序区间内查找目标值:

    • 如果左半部分是有序的,并且目标值 target 落在这个有序区间中,那么我们缩小搜索范围到左半部分,即更新 right = mid - 1。
    • 如果目标值不在左半部分有序区间内,则我们将搜索范围缩小到右半部分,即更新 left = mid + 1。
  4. 反之亦然:如果发现右半部分是有序的,执行同样的判断。如果目标值在右半部分有序区间内,就在右侧继续查找;否则,继续在左侧查找。

  5. 终止条件:每次通过调整 left 和 right 指针,最终要么找到目标值,要么当 left > right 时,确定目标值不存在。

思路示例

以数组 [4, 5, 6, 7, 0, 1, 2] 和 target = 1 为例,具体操作如下:

  • 初始状态:

    • left = 0,right = 6,mid = 3,nums[mid] = 7。
    • 比较 nums[left] = 4 和 nums[mid] = 7,确定左半部分 [4, 5, 6, 7] 是有序的。
    • 目标 1 不在这个有序区间内,搜索右半部分 [0, 1, 2]。
  • 第二次查找:

    • 更新 left = 4,right = 6,mid = 5,nums[mid] = 1。
    • 找到目标值 1,返回 mid = 5。

这个过程利用了旋转数组的有序性特征,确保了每次都能在正确的区间内查找目标值。

点击查看代码
func search(nums []int, target int) int {left, right := 0, len(nums) - 1while left <= right {mid := left + (right - left) / 2// 找到目标值if nums[mid] == target {return mid}// 判断左半部分是否有序if nums[left] <= nums[mid] {// 如果目标值在左半部分的有序区间内if target >= nums[left] && target < nums[mid] {right = mid - 1} else {left = mid + 1}} else {// 右半部分有序if target > nums[mid] && target <= nums[right] {left = mid + 1} else {right = mid - 1}}}// 目标值不存在return -1
}

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

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

相关文章

linux使用yum命令报错Cannot find a valid baseurl for repo: base/7/x86_64

【问题】 在VMware上安装搭建centOS 7虚拟机,配置好网络后,尝试通过yum命令进行安装docker容器。执行命令报错: 已加载插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile  Could not retrieve mirrorlist http://mirrorlist.centos.org/?relea…

研发工程师的「第一性原理」思维

回顾复盘五年来的研发经历,愈发认同身边同事强调的“第一性原理”思维,仅做浅浅记录和分享一、定义与理论介绍第一性原理(First Principles),又称基本原理,是指从最基本的假设和定义出发,通过逻辑推理和演绎得出结论的一种思维方法。它强调对事物的本质和根源进行深入的…

Meta Llama3 论文研读

一、 引言概述(Intro & Overview) Llama3是一系列基于Transformer结构的大型多语言模型,通过优化数据质量、训练规模和模型架构,旨在提升模型在各种语言理解任务中的表现。通过引入更优质的数据和更高效的训练方法,Llama3展示了在自然语言处理领域的巨大潜力。其创新点…

9月26日云技术研讨会 | SOA整车EE架构开发流程及工具实施方案

本次研讨会经纬恒润将结合业务团队多年来在SOA架构开发和工具实施领域的项目实践经验,分享探讨SOA趋势下先进的整车EE架构开发模式,聚焦在SOA开发难点分析、开发阶段划分、开发工具链的适配与应用等内容。9月26日,我们在直播间期待您的参与! 面向服务的架构(Service…

服务的UUID

1. UUID 广播数据中,一般会包含一个UUID列表,用以展示自己支持的服务。但是GAP和GATT服务的UUID不能加到广播中。广播包中可以根据自身情况包含一部分服务的UUID或者包含所有服务的UUID。部分服务的UUID列表和完整的UUID列表只能包含一个。 什么情况下包含部分UUID?广播数据…

Common PyPI?

Skip to main contentTwo factor authentication is available, enable it now for your account.Search PyPISearch macnote Common questions BasicsWhats a package, project, or release? How do I install a file (package) from PyPI? How do I package and publish my…

Hackademic.RTB1 打靶记录

第一次打靶机,思路看的红队笔记https://www.vulnhub.com/entry/hackademic-rtb1,17/环境:kali Linux - 192.168.75.131,靶机 - 192.168.75.132 主机发现和端口扫描扫描整个网络有哪台机子在线,不进行端口扫描 nmap -sP 192.168.75.0/24 Starting Nmap 7.93 ( https://nmap.…

安装网站时出现“连接数据库出现数据库服务器或登录密码无效,无法连接数据库,请重新设定”解决方法

当你在安装网站时遇到“连接数据库出现数据库服务器或登录密码无效,无法连接数据库,请重新设定”的错误时,可以按照以下步骤来排查和解决这个问题。 排查步骤确认数据库连接信息:确认数据库服务器地址、用户名、密码、数据库名称等信息是否正确。 确认数据库服务器是否处于…

易优eyoucms网站二次验证密码忘记解决办法

当你忘记了易优CMS(EyouCMS)后台的二次验证密码时,可以通过修改数据库中的相关设置来绕过或重置这个验证。根据提供的记录信息,可以按照以下步骤来进行操作: 步骤登录数据库 修改相关设置 清除缓存详细步骤 1. 登录数据库 首先,你需要登录到你的MySQL数据库。你可以使用命…

mysql事务隔离级别和spring事务传播机制

一、事务并发会出现的三个问题 数据库事务具有ACID4个特性: A:Atomic,原子性,将所有SQL作为原子工作单元执行,要么全部执行,要么全部不执行; C:Consistent,一致性,事务完成后,所有数据的状态都是一致的,即A账户只要减去了100,B账户则必定加上了100; I:Isolation…

电商系统的简单设计

订单模块 作为电商系统,首入眼帘的就是订单模块,也是电商基础的模块之一。订单流程包含了订单从下单到完成的整个流程,订单的状态如下:这里迎来了第一个问题,可以看到订单状态有非常多种,如果用if else去做判断,逻辑会非常多,这时候就需要用到状态机模式了,状态机如何使…

限流器的实践

背景 我们有一个业务场景是给学生发布考试,发布的过程不复杂,就是一个老师传递一些考试相关的参数过来,服务器自动给所有学生生成一份任务,但是在学生上交的时候会有个问题,就是成百上千的学生一起上交,会有并发流量的问题。 这里由于我们的考试可能会设计多个班级的联考…