面试经典150题——最长连续序列

news/发布时间2024/9/20 7:18:42

"The only limit to our realization of tomorrow will be our doubts of today." - Franklin D. Roosevelt

green plant beside white desk

1. 题目描述

image-20240226101211338

2.  题目分析与解析

2.1 思路一

题目要求我们使用时间复杂度为O(n)的解决方案,那么肯定就不能排序了。因为排序算法不可能达到O(n)的时间复杂度。

常见的排序算法包括:

  1. 冒泡排序(Bubble Sort):时间复杂度为O(n^2)。

  2. 选择排序(Selection Sort):时间复杂度为O(n^2)。

  3. 插入排序(Insertion Sort):时间复杂度为O(n^2)。

  4. 归并排序(Merge Sort):时间复杂度为O(n log n)。

  5. 快速排序(Quick Sort):平均时间复杂度为O(n log n),最坏情况下为O(n^2)。

  6. 堆排序(Heap Sort):时间复杂度为O(n log n)。

  7. 希尔排序(Shell Sort):时间复杂度取决于间隔序列的选择,一般为O(n log n)到O(n^2)。

  8. 计数排序(Counting Sort):时间复杂度为O(n + k),其中k是输入范围。

  9. 桶排序(Bucket Sort):时间复杂度为O(n + k),其中k是桶的数量。

  10. 基数排序(Radix Sort):时间复杂度为O(d * (n + k)),其中d是数字的位数,k是基数。

那就只有考虑怎么用空间换时间,也就是把每一个走过的信息存储起来,方便后续使用,才有可能达到O(n)的时间复杂度。

现在我们再来审一下题目,既然题目要求连续,这是一个核心特征,我们就要根据这个特征作为抓手,看它有什么性质,从而给出可能的解决方案。

什么是连续?

题目中提到的连续指的是如 {1,2,3,4,5,6,7}这样的数字,它有什么特点?是不是显而易见,每个数字之差相差1。根据这个性质能否想出解决方案?

是可以的。假设我们遍历数组的每一个元素,我要看当前数字是否能和其它之前遍历过的数字是否连续,那么就只需要判断是否在之前遍历的集合中是否有某个数字与它的绝对值之差等于1,也就是:

  • 要么之前走过的某个数等于当前数+1

  • 要么之前走过的某个数等于当前数-1

那么就可以知道这两个数字是连续的,就可以把现有连续的数字长度加一,那么就说明我们对于走过的数字不仅仅需要存储数字本身,还需要存储当前序列的长度。而又因为每加入一个数字,都是在当前数字串的基础上加在前面或者加在后面,所以我们在存储序列长度时只需要将序列的头部与尾部更新长度即可:

对于上图所示,如果对于一个新加入的数字5,那么我们发现存在6=5+1,所以我们就把5拼接在6前面,此时需要更新该 5,6,7串的首尾两个数字的 序列长度,将其更新为3。但是注意,对于如下的情况:

image-20240227102613017

如上图所示,如果遍历到数字5,发现 5=4+1,而且 5+1=6,此时注意如果把该数字加入序列,那么就需要更新整体序列的第一个元素 3和最后一个元素 7的序列长度,将其变为5,如下:

image-20240227102914348

数字5处的对应的数字为1无需关系,只是一个默认数字。

所以根据以上的思路,我们就可以写出如下:

代码思路:

  1. 初始化:定义一个hashMap,用来存储走过的数字

  2. 遍历整个nums数组,判定当前数与某个走过的数字绝对值之差是否等于1

    image-20240227103126734

    就需要更新 3和7处也就是序列合并后的头与尾的长度

    那么就只需要更新当前数字和当前序列尾部数字对应的序列长度值

    • 最后判断如果存在走过的数字中某个数小于当前数1,那么就对应下述情况:

      此时只需要更新当前数字和当前序列头部数字对应的序列长度值

    • 然后判断如果存在走过的数字中某个数大于当前数1,那么就对应下述情况:

    • 先判断如果存在走过的数字中某个数大于当前数1,而且村子啊某个数小于当前数1,那么就对应下述情况:

  3. 遍历结束后hashMap中最大value即为结果

2.2 思路二

引自力扣官方

image-20240227124422206

实现过程动图如下:

recording

增加了判断跳过的逻辑之后,时间复杂度是多少呢?外层循环需要 O(n)的时间复杂度,只有当一个数是连续序列的第一个数的情况下才会进入内层循环,然后在内层循环中匹配连续序列中的数,因此数组中的每个数只会进入内层循环一次。根据上述分析可知,总时间复杂度为 O(n),符合题目要求。

在这里我主要给官方解析代码加一下注释,见后续代码实现。

3. 代码实现

image-20240227113446822

image-20240227113456394

思路一优化

其实我们记住问题的本质,要寻找的是最大序列的长度,对应上述解题思路就是最大的value,那我们为何不用一个变量来存储最大的value,这样就没必要在遍历结束后从hashMap中找最大value了。因此我们可以进行优化如下:

image-20240227123350130

image-20240227114059815

3.2 思路二

image-20240227125332924

image-20240227125315223

4. 相关复杂度分析

方法一:优化版(longestConsecutive_optimized

逻辑

  • 使用一个HashMap来追踪每个数字是否被访问过,以及它所在序列的长度。

  • 遍历给定数组,对于每个元素,检查其前后元素是否存在于HashMap中,并据此更新序列的长度。

时间复杂度

  • 遍历给定数组一次,时间复杂度为O(n)

  • 对于每个元素,查找和更新HashMap的操作均可在常数时间内完成(假设HashMap的操作为O(1))。

  • 因此,总的时间复杂度是O(n)

空间复杂度

  • 使用了一个HashMap来存储至多n个元素及其对应的序列长度,因此空间复杂度为O(n)

方法二:基于HashSet(longestConsecutive2

逻辑

  • 首先,将所有元素存入HashSet中,以便快速查找任意元素是否存在。

  • 然后,遍历HashSet,对于每个元素,如果它的前一个元素不存在于HashSet中,则认为它是序列的起点,并从这个点开始尝试构建连续序列。

时间复杂度

  • 将所有元素添加到HashSet中的时间复杂度为O(n)

  • 遍历HashSet的时间复杂度也为O(n)。对于每个序列的起始元素,我们可能会在HashSet中进行多次查找(最坏情况下为序列长度次),但每个元素最多被访问两次(一次作为某个序列的一部分,另一次作为尝试找下一个元素)。因此,整体的时间复杂度依然是O(n)

空间复杂度

  • 使用了一个HashSet来存储所有元素,空间复杂度为O(n)

总结

两种方法都具有O(n)的时间复杂度和O(n)的空间复杂度。主要区别在于实现细节和具体操作。优化版方法直接在遍历过程中更新和记录序列的长度,而基于HashSet的方法则是先构建一个集合,再通过这个集合找到所有可能的序列起点,从而构建序列。

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

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

相关文章

Java-nio

一、NIO三大组件 NIO的三大组件分别是Channel,Buffer与Selector Java NIO系统的核心在于:通道(Channel)和缓冲区(Buffer)。通道表示打开到 IO 设备(例如:文件、套接字)的连接。若需要使用 NIO 系统,需要获取用于连接 IO 设备的通…

打造去中心化透明储蓄罐:Solidity智能合约的又一实践

一、案例背景 传统的储蓄罐通常是由个人或家庭使用,用于存放硬币或小额纸币。然而,这样的储蓄罐缺乏透明性,用户无法实时了解储蓄情况,也无法确保资金的安全性。 通过Solidity智能合约,我们可以构建一个去中心化…

金三银四,自动化测试面试题精选【美团二面】

面试一般分为技术面和hr面,形式的话很少有群面,少部分企业可能会有一个交叉面,不过总的来说,技术面基本就是考察你的专业技术水平的,hr面的话主要是看这个人的综合素质以及家庭情况符不符合公司要求,一般来…

sawForceDimensionSDK安装,sigma7+ros

force dimension的sdk中没有关于ros,借助开源的sawForceDimensionSDK实现对于数据的封装和可视化,方便后续使用 链接: GitHub - jhu-saw/sawForceDimensionSDK 具体步骤: 安装qt和ros,官网下载Force Dimension SDK …

整合swagger,并通过Knife4j美化界面

如果是前后端分离的项目&#xff0c;需要前端的参与&#xff0c;所以一个好看的接口文档非常的重要 1、引入依赖 美化插件其中自带swagger的依赖了&#xff0c;所以不需要再单独导入swagger的坐标了 <dependency><groupId>com.github.xiaoymin</groupId>&…

免费音频剪辑

在数字时代&#xff0c;音频剪辑已成为许多职业和爱好者不可或缺的技能。无论是制作播客、教育视频、还是进行广告宣传&#xff0c;高质量的音频剪辑都能为作品增色不少。今天&#xff0c;我要为大家强烈安利一款免费且功能强大的音频剪辑工具&#xff0c;它绝对是你办公桌上不…

CDH6.3.1离线安装

一、从官方文档整体认识CDH 官方文档地址如下&#xff1a; CDH Overview | 6.3.x | Cloudera Documentation CDH是Apache Hadoop和相关项目中最完整、测试最全面、最受欢迎的发行版。CDH提供Hadoop的核心元素、可扩展存储和分布式计算&#xff0c;以及基于Web的用户界面和重…

【LeetCode】一周中的第几天+ 一年中的第几天

2023-12-30 文章目录 一周中的第几天方法一&#xff1a;模拟思路步骤 方法二&#xff1a;调用库函数方法三&#xff1a;调用库函数 [1154. 一年中的第几天](https://leetcode.cn/problems/day-of-the-year/)方法一&#xff1a;直接计算思路&#xff1a; 方法二&#xff1a;调用…

【Qt】Sqlite数据库加密

1. 加密方式 对数据库文件加密。既不会暴露表结构&#xff0c;也不会暴露数据细节。 2. 加密工具&#xff08;QtCipherSqlitePlugin&#xff09; 用于密码 SQLite 的 Qt 插件&#xff0c;它基于 SQLite 源和 wxWidget 中的 wxSQLite3插件github地址&#xff1a;https://gith…

2024.2.27每日一题

之前是出去旅游了没发&#xff0c;现在开学了&#xff0c;继续每日一题&#xff0c;继续卷&#xff0c;一上来就是困难题&#x1f613;&#xff0c;直接cv大法。 LeetCode 统计树中的合法路径数目 2867. 统计树中的合法路径数目 - 力扣&#xff08;LeetCode&#xff09; 题目…

爬取某牙视频

爬取页面链接&#xff1a;游戏视频_游戏攻略_虎牙视频 爬取步骤&#xff1a;点进去一个视频播放&#xff0c;查看media看有没有视频&#xff0c;发现没有。在xhr中发现有许多ts文件&#xff0c;但这种不是很长的视频一般都有直接的播放链接&#xff0c;所以目标还是找直接的链…

[开源协议] 什么是MIT协议及其使用场景

什么是MIT协议? MIT协议是一种开放源代码软件授权协议&#xff0c;全称为Massachusetts Institute of Technology License。该协议允许自由地使用、复制、修改、合并、发布、分发、再授权和销售软件及其副本的任何部分。MIT协议要求在软件的所有副本中包含版权声明和许可声明…

C语言----联合体

不知道大家是否听说过联合体这个名词。但其实大家不用觉得联合体有多特殊&#xff0c;大家可以想象结构体是一栋楼&#xff0c;里面有很多房间&#xff0c;住了形形色色的住户&#xff08;不用或者相同的数据&#xff09;。但联合体只有一个房间&#xff0c;所有的住户都挤在这…

UDP 与 TCP 的区别是什么?

目录 区别 一、面向无连接 二、不可靠性 三、高效 四、传输方式 五、适用场景 1.直播 2.英雄联盟 六、总结 区别 首先 UDP 协议是面向无连接的&#xff0c;也就是说不需要在正式传递数据之前先连接起双方。然后 UDP 协议只是数据报文的搬运工&#xff0c;不保证有序且…

百度SEO工具,自动更新网站的工具

在网站SEO的过程中&#xff0c;不断更新网站内容是提升排名和吸引流量的关键之一。而对于大多数网站管理员来说&#xff0c;频繁手动更新文章并进行SEO优化可能会是一项繁琐且耗时的任务。针对这一问题&#xff0c;百度自动更新文章SEO工具应运而生&#xff0c;它能够帮助网站管…

OD(13)之Mermaid饼图和象限图

OD(13)之Mermaid饼图和象限图使用详解 Author: Once Day Date: 2024年2月29日 漫漫长路才刚刚开始… 全系列文章可参考专栏: Mermaid使用指南_Once_day的博客-CSDN博客 参考文章: 关于 Mermaid | Mermaid 中文网 (nodejs.cn)Mermaid | Diagramming and charting tool‍‌⁡…

在Windows中安装PyTorch

文章目录 1. 创建虚拟环境2. 检查显卡版本和CUDA3. 下载链接4. 下载5. 等待6. 检测 1. 创建虚拟环境 具体查看我之前写的 《在Windows中利用Python的venv和virtualenv创建虚拟环境》 2. 检查显卡版本和CUDA 这种情况是需要电脑上有单独的英伟达的显卡、或者英伟达的显卡和集显…

Container killed on request. Exit code is 143

Bug信息 WARN YarnAllocator: Container marked as failed: container_e33_1480922439133_0845_02_000002 on host: hdp4. Exit status: 143. Diagnostics: Container killed on request. Exit code is 143 Container exited with a non-zero exit code 143 Killed by externa…

uniapp问卷调查(单选)

前言 该代码片段只支持问卷调查的单选功能 使用组件库 配置 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架 (uviewui.com) 代码 <template> <view> <view v-for"(item, index) in radiolist1" :key"index"> …

HarmonyOS—使用数据模型和连接器

Serverless低代码开发平台是一个可视化的平台&#xff0c; 打通了HarmonyOS云侧与端侧能力&#xff0c;能够轻松实现HMS Core、AGC Serverless能力调用。其中&#xff0c;数据模型和连接器是两大主要元素。开发者在使用DevEco Studio的低代码功能进行开发时&#xff0c;可以使用…
推荐文章