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

news2025/1/9 5:19:06

文章目录

  • 1.问题描述
  • 2.难度等级
  • 3.热门指数
  • 4.解题思路
    • 思路
    • 复杂度分析
  • 5.实现示例
  • 参考文献

1.问题描述

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

假设数组在预先未知的某个点上进行了旋转。

如数组 [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], target = 3
输出:-1

示例 3:

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

2.难度等级

medium。

3.热门指数

★★★★☆

出题公司:腾讯音乐。

4.解题思路

思路

本题是数组,而且要求时间复杂度为 O(logn) 。应该能够自然想到二分查找。

但是直接使用二分查找行不行呢?我们看一看下面这个例子:

在数组 [3 4 5 6 7 8 0 1 2 3] 中使用二分查找 0。

在这里插入图片描述
第一次循环时,left = 0,right = 9,得到 mid = 4,此时nums[mid] = 7,target < nums[mid] ,所以应该有 right = mid - 1。因此得到
在这里插入图片描述
很明显,target 不在 [left,right]。因此直接使用二分法不行。

这是因为该数组在预先未知的某个点上进行了旋转,已不再是一个完全的升序数组。

首先理解以下这个旋转特性。

在这里插入图片描述
可以看到,旋转就是将一个有序数组从某两个元素的中间切了一刀,形成了两个有序子数组,然后将第一个有序子数组放到了第二个有序子数组之后。

那么应该如何将这一特性与二分查找结合呢?

这道题中,数组本身不是有序的,进行旋转后只保证了数组的局部是有序的,这还能进行二分查找吗?答案是可以的。

将旋转排序数组均分,一定有一部分的数组是有序的。

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

这启示我们可以在常规二分查找的时候查看当前 mid 为分割位置分割出来的两个部分 [l, mid] 和 [mid + 1, r] 哪个部分是有序的,并根据有序的那个部分确定我们该如何改变二分查找的上下界,因为我们能够根据有序的那部分判断出 target 在不在这个部分。

  • 如果 [l, mid-1] 是有序数组,且 target 大小满足 [nums[l],nums[mid]),则将搜索范围缩小至 [l, mid-1],否则在 [mid+1, r] 中寻找。
  • 如果 [mid, r] 是有序数组,且 target 大小满足 (nums[mid],nums[r]],则将搜索范围缩小至 [mid+1, r],否则在 [l, mid-1] 中寻找。

也就是说,将数组一分为二,其中一定有一个是有序的,另一个可能是有序,也能是部分有序。

此时有序部分用二分法查找。无序部分再一分为二,其中一个一定有序,另一个可能有序,可能无序。

就这样循环。

复杂度分析

时间复杂度:O(logn),其中 n 为 nums 数组的长度。整个算法时间复杂度即为二分查找的时间复杂度。

空间复杂度:O(1)。我们只需要常数级别的空间存放变量。

5.实现示例

下面以 Golang 为例,给出实现示例。

func search(nums []int, target int) int {
l, r := 0, len(nums)-1
	for l <= r {
		mid := (l + r) / 2
		if nums[mid] == target {
			return mid
		}
		// 左区间是有序的。
		if nums[l] <= nums[mid] {
			// target 在左区间
			if target >= nums[l] && target < nums[mid] {
				r = mid - 1
				continue
			}
			// target 在右区间
			l = mid + 1
			continue
		}
		// 右区间是有序的。
		if nums[mid] <= nums[r] {
			// target 在右区间
			if target > nums[mid] && target <= nums[r] {
				l = mid + 1
				continue
			}
			// target 在左区间
			r = mid - 1
			continue
		}
	}
	return -1
}

运行示例:

package main

import (
	"fmt"
)

func main() {
	fmt.Println(search([]int{4, 5, 6, 7, 0, 1, 2}, 0))
	fmt.Println(search([]int{4, 5, 6, 7, 0, 1, 2}, 3))
	fmt.Println(search([]int{1}, 0))
}

运行输出:

4
-1
-1

参考文献

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何安装Nginx服务

目录 一、Nginx服务 Nginx的并发能力受影响因素 二、Nginx与Apache的差异 Nginx相对于Apache的优点 Apache相对于Nginx的优点 三、阻塞/非阻塞 四、同步/异步 Nginx应用场景 五、编译安装Nginx服务 关闭防火墙和安全机制 安装依赖环境 将相关包导入/opt当中 进入指…

Linux分区的基本概念。

文章目录 前言 一、分区概念 1&#xff0c;书名&#xff0c;主引导纪录&#xff08;&#xff2d;&#xff22;&#xff32;&#xff09; 2&#xff0c;正文&#xff0c;就是硬盘中纪录的数据。 3&#xff0c;索引相当于硬盘中的分区表 3.1主分区&#xff08;存放地址&#xff0…

React、Vue项目build打包编译后如何再修改后台请求地址

vue项目大家都了解&#xff0c;开发用 npm run dev/npm run serve。而要上线则必须是先将项目打包编译 npm run build 之后成为了普通的静态网页才可上线进行部署及发布。同样这时候我们也已经将代码全部写好了。如果说要改里面的某个值或者修改请求地址我们应该怎么办呢&#…

IDEA中创建编写JSP

一、安装Tmocat并配置环境 安装请参考&#xff1a;https://www.cnblogs.com/weixinyu98/p/9822048.html 安装请参考&#xff1a;https://www.cnblogs.com/zhanlifeng/p/14917777.html 注意&#xff1a;在安装成功Tomcat测试是否成功安装时&#xff0c;访问“http://localhost:8…

selenium自动化教程及使用java来爬取数据

目录 一、介绍二、下载浏览器驱动1.获取要下载的驱动版本号2.下载驱动 三、Maven如下四、简单使用五、定位器1.定位器2.说明(1) class name 定位器(2) css selector 定位器(3) id 定位器(4) name 定位器(5) link text 定位器(6) partial link text 定位器(7) tag 定位器(8) xpa…

Android 内存检测LeakCanary

在github上下载了一个项目&#xff1a;安装debug版本会产生两个apk&#xff0c;一个是apk本身&#xff0c;一个是Leaks release版本就正常 不会产生这个问题&#xff0c;百思不得其解&#xff0c;第一次遇到这个问题。 看到这篇博客豁然开朗&#xff1a;在build.gradle.kts 里…

3天爆肝整理,性能测试问题汇总+解决办法(重要)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 开始性能测试前需…

入门孪生网络3-------使用一维卷积神经网络1DCNN与孪生网络的组合模型来实现excel数据的分类

文章目录 前言入门孪生网络的第三小节&#xff0c;我尝试使用keras或tensorflow2框架来搭建一个数据分类的网络。大家可以参考的程序思路&#xff0c;我也是小白&#xff0c;可以评论区一起讨论。 一、孪生网络与1DCNN组合网络的搭建思路二、我编写的孪生网络与1DCNN组合网络程…

操作教程:EasyCVR视频融合平台如何配置平台级联?

EasyCVR视频融合平台基于云边端一体化架构&#xff0c;可支持多协议、多类型设备接入&#xff0c;在视频能力上&#xff0c;平台可实现视频直播、录像、回放、检索、云存储、告警上报、语音对讲、电子地图、集群、智能分析以及平台级联等。平台可拓展性强、开放度高、部署轻快&…

干货讲解,财务报表结构分析

财务报表的构成是对企业财务状况、经营成果和现金流量的结构性表述。企业必须重视财务结构对经营业绩的影响&#xff0c;才能解决发展中的问题。 资产质量关注两个角度&#xff0c;一是资产结构&#xff0c;二是现金含量。 资产结构是什么意思呢&#xff1f;就是固定资产和无…

Linux 定时任务提权

Linux 定时任务提权 1.概述2.定时任务创建3.提权步骤 1.概述 定时任务&#xff08;cron job&#xff09;是Linux系统中的一个守护进程&#xff0c;用于调度重复任务&#xff0c;通过配置crontab可以让系统周期性地执行某些命令或者脚本。cron 是 Linux 系统中最为实用的工具之…

apple pencil二代平替笔哪个好用?苹果平板触控笔

随着互联网的快速发展&#xff0c;移动数码产品如手机、平板电脑、笔记本等正逐步进入人们的日常生活。同时电容笔的出现&#xff0c;也让这些产品的功能作用更上一层楼。由于苹果原装电容笔的价格非常贵&#xff0c;使得国内出现了越来越多的平替电容笔。总的来说&#xff0c;…

前端开发:基于cypress的自动化实践

如何在vue中使用cypress如何运行cypress如何编写测试用例如何解决测试数据的问题遇到的元素定位的问题如何看待cypresscypress是否为最佳工具测试怎么办&#xff1f; 如何在vue中使用cypress vue提供了vue-cli 可以快速的创建vue项目。 vue create hello-world在选择安装项里…

【亲测】集群环境中MMDetection3.0环境配置

本文记录下在集群环境下使用MMDetection的内容。 环境简介&#xff1a;所用集群设备为本地集群&#xff0c;具有管理节点和计算节点&#xff0c;且管理和计算在不同的主机上&#xff0c;作为用户&#xff0c;没有超级管理员权限。 MMdetection源码下载点击进入 这里主要记录下环…

二叉树题目:二叉树的中序遍历

文章目录 题目标题和出处难度题目描述要求示例数据范围进阶 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 解法三思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉树的中序遍历 出处&#xff1a;94. 二叉树的中序遍历 难度 3 级 题目描…

Windows Terminal添加至鼠标右键

Windows Terminal添加至鼠标右键 安装 在Microsoft Store中即可下载。 配置 在鼠标右键打开 下载Terminal图标 图标地址:https://raw.githubusercontent.com/microsoft/terminal/master/res/terminal.ico 下载后保存在某个文件夹path 添加到鼠标右键 批处理修改注册表 …

Linux常见指令(超详解哦)

Linux常见指令 引言Linux常见指令查指令——man文件管理相关指令lspwdcdtouchmkdirrmdir与rmrmdirrm cpmvfind 文件查看类catmorelesshead 与 tailheadtail使用管道显示某段内容 grep 打包压缩相关指令zip/unziptar 总结 引言 Linux与我们熟悉的Window都是操作系统&#xff0c…

spring-aop入门

spring-aop入门 什么是AOP OOP(Object-Oriented Programming)面向对象编程&#xff0c;允许开发者定义纵向的关系&#xff0c;但并适用于定义横向的关系&#xff0c;导致了大量代码的重复&#xff0c;而不利于各个模块的重用。 AOP(Aspect-Oriented Programming)&#xff0c;…

优思学院|质量管理六大思维陷阱【五】:有了控制图就能改进质量?

1. 引言 在工厂的生产过程中&#xff0c;质量控制是至关重要的。控制图是一种常见的质量管理工具&#xff0c;它可以帮助工厂监测过程的稳定性和质量表现&#xff0c;同时它也是六西格玛最重要的工具之一。然而&#xff0c;人们对于控制图的理解并不总是正确&#xff0c;有时被…

【中危】Kubernetes secrets-store-csi-driver 信息泄露漏洞

漏洞描述&#xff1a; Kubernetes secrets-store-csi-driver 是一个用于 Kubernetes 的 CSI 驱动程序&#xff0c;它提供了一种将外部密钥存储系统中的凭据注入到 Kubernetes Pod 的机制。 在 secrets-store-csi-driver 受影响版本中&#xff0c;当在 CSIDriver 对象中配置了…