最长连续序列(leetcode 128)

文章目录

  • 1.问题描述
  • 2.难度等级
  • 3.热门指数
  • 4.解题思路
    • 方法一:排序
    • 方法二:哈希表
  • 5.实现示例
  • 参考文献

1.问题描述

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

示例 2:

输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9

2.难度等级

medium。

3.热门指数

★★★★☆

出题公司:阿里、腾讯、百度、字节。

4.解题思路

方法一:排序

根据本题的描述,一般来说,最容易想到的就是先将 nums 进行排序,然后再从排序后的数组头部开始遍历,如果存在nums[i]+1,则进行加1计数。只要不存在 nums[i]+1,则从 0 开始重新执行计数操作。那么,每当发生了“断点”,如果当前连续序列长度大于 result 则更新 result 值,result 表示最长连续序列的长度。

但是由于本题目要求实现时间复杂度为 O(n) 的算法解决此问题,那么排序的做法我们就无法实现了。那么,我们还有什么别的方法来解决这道题吗?

方法二:哈希表

我们考虑枚举数组中的每个数 x,考虑以其为起点,不断判断 x+1,x+2,⋯x+1, x+2,⋯ 是否存在,假设最长匹配到了 x+y,其长度为 y+1,我们不断枚举并更新答案即可。

对于匹配的过程,暴力的方法是 O(n) 遍历数组去看是否存在这个数,但其实更高效的方法是用一个哈希表存储数组中的数,这样查看一个数是否存在即能优化至 O(1) 的时间复杂度。

仅仅是这样我们的算法时间复杂度最坏情况下还是会达到 O(n^2),当整个数组为最长序列,外层需要枚举 O(n) 个数,内层需要暴力匹配 O(n) 次,无法满足题目的要求。但仔细分析这个过程,我们会发现其中执行了很多不必要的枚举,如果已知有一个 x,x+1,x+2,⋯ ,x+y 的连续序列,而我们却重新从 x+1,x+2 或者是 x+y 处开始尝试匹配,那么得到的结果肯定不会优于枚举 x 为起点的答案,因此我们在外层循环的时候碰到这种情况跳过即可。

那么怎么判断是否跳过呢?由于我们要枚举的数 x 一定是在数组中不存在前驱数 x−1。不然按照上面的分析我们会从 x−1 开始尝试匹配,因此我们每次在哈希表中检查是否存在 x−1 即能判断是否需要跳过了。

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

5.实现示例

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

注意,Golang 中如果哈希表只有 key 没有 value,建议使用 map[any]struct{},因为空结构体不占用内存空间。

func longestConsecutive(nums []int) int {m := make(map[int]struct{}, len(nums))for _, n := range nums {m[n] = struct{}{}}var longestStreak intfor x := range m {// 跳过逻辑if _, ok := m[x-1]; ok {continue}// 计算连续子序列长度y := x + 1for ;;y++{if _, ok := m[y]; !ok {break}}if y - x > longestStreak {longestStreak = y-x}}return longestStreak
}

LeetCode 运行结果如下:

在这里插入图片描述


参考文献

128. 最长连续序列 - leetcode

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

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

相关文章

【华为OD题库-049】评论转换输出-java

题目 在一个博客网站上,每篇博客都有评论。每一条评论都是一个非空英文字母字符串。评论具有树状结构,除了根评论外,每个评论都有一个父评论。 当评论保存时,使用以下格式: 首先是评论的内容; 然后是回复当前评论的数量。 最后是当…

如何保持操纵机构丝杆的精度?

滚珠丝杆是操纵机构中的重要组成部分,可以传递较高的扭矩,并且具有低摩擦、高效率和快速响应的特性,这使得操纵机构能够实现高速、高精度的运动控制,这对于整个系统的性能和精度具有决定性的影响,保持操纵机构丝杆的精…

互联网Java工程师面试题·Spring Boot篇·第二弹

目录 8、什么是 YAML? 9、如何实现 Spring Boot 应用程序的安全性? 10、如何集成 Spring Boot 和 ActiveMQ? 11、如何使用 Spring Boot 实现分页和排序? 12、什么是 Swagger?你用 Spring Boot 实现了它吗? …

YoloV5改进策略:Swift Parameter-free Attention,无参注意力机制,超分模型的完美迁移

摘要 https://arxiv.org/pdf/2311.12770.pdf https://github.com/hongyuanyu/SPAN SPAN是一种超分网络模型。SPAN模型通过使用参数自由的注意力机制来提高SISR的性能。这种注意力机制能够增强重要信息并减少冗余,从而在图像超分辨率过程中提高图像质量。 具体来说,SPAN模…

【wvp】测试记录

ffmpeg 这是个莫名其妙的报错,通过排查,应该是zlm哪个进程引起的 会议室的性能 网络IO也就20M

全志T527设置gpio口输出高电平实际输出低电平

前言 在调试T527的时候,主板另外添加了gpio口去控制usb口的电源开关,软件上面需要在内核运行的时候将gpio口设置输出高电平,usb口才可以正常使用。改好系统固件后,升级发现,机器开机动画过程中可以控制gpio口去打开us…

ArkUI组件--Button组件

1.声明Button组件 Button(label?:ResourceStr) #label是按钮上显示的文本 ①label是文字类型 所写文字会在按钮上显示 ②不输入label内容,需要额外定义一些描述。例如插入图片(需要定义图片属性) Button(){Image($r(app.media.xxx)).wi…

【题目】栈和队列专题

文章目录 专题一:栈系列1. 中缀表达式转后缀表达式(逆波兰式)2. 有效的括号3. 用栈实现队列4. 最小栈 专题一:栈系列 1. 中缀表达式转后缀表达式(逆波兰式) 算法原理 2. 有效的括号 题目链接 算法原理 代…

SpringBoot-监听Nacos动态修改日志级别

目录 一、pom文件 二、项目配置文件 三、日志配置文件 四、日志监听类 五、日志动态修改服务类 线上系统的日志级别一般都是 INFO 级别,有时候需要查看 WARN 级别的日志,所以需要动态修改日志级别。微服务项目中使用 Nacos 作为注册中心&#xff0c…

C++面试宝典第2题:逆序输出整数

题目 写一个方法,将一个整数逆序打印输出到控制台。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如:123的逆序输出为321,8600的逆序输出为68,-609的逆序输出为-906。 解析 这道题本身并没有什么…

Java架构师技术架构路线

目录 1 概论2 如何规划短中长期的技术架构路线图3 如何规划面向未来的架构4 如何修订路线图执行过程中的偏差5 如何落地路线图-阿里系糙快猛之下的敏捷模式想学习架构师构建流程请跳转:Java架构师系统架构设计 1 概论 首先,规划一个短中长期的技术路线图是非常重要的。短中…

java SSM毕业生信息管理myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

前言 学校的规模不断扩大,学生数量急剧增加,有关学生的各种信息量也成倍增长。面对庞大的信息量需要有学生信息管理系统来提高学生管理工作的效率。通过这样的系统可以做到信息的规范管理、科学统计和快速查询、修改、增加、删除等,从而减少管…

lv11 嵌入式开发 RTC 17

目录 1 RTC简介 ​编辑2 Exynos4412下的RTC控制器 2.1 概述 2.2 特征 2.3 功能框图 3 寄存器介绍 3.1 概述 3.2 BCD格式的年月日寄存器 3.3 INTP中断挂起寄存器 3.4 RTCCON控制寄存器 3.5 CURTICCNT 作为嘀嗒定时器使用的寄存器 4 RTC编程 5 练习 1 RTC简介 RTC(…

关于优雅的使用SQL多行转多列的记录(doris)

文章目录 应用需求场景记录过程1. 准备数据2. 给数据根据姓名分组,加上序号.3. 根据name分组成map结构4. 拆分map 应用需求场景 准备的数据是这样的: 需要将每个人的成绩显示在一行上,需要的结果如下,但是我的情况是课程有非常…

联想LJ2655DN激光打印机清零方法

随着打印机的使用越来越频繁,需要更换耗材的时候也越来越多;但是更换上新的耗材后,很多用户都会遇到一个问题,就是更换完新的耗材后打印机仍然提示寿命将近,或者无墨粉盒灯情况,这个时候就需要我们对打印机…

qt 5.15.2 主窗体事件及绘制功能

qt 5.15.2 主窗体事件及绘制功能 显示主窗体效果图如下所示&#xff1a; main.cpp #include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.setFixedWidth(600);w.setFixedHeight(6…

Nat easy IP ACL

0表示匹配&#xff0c;1表示任意&#xff08;主机位0.0.0.255&#xff08;255主机位&#xff09;&#xff09; rule deny source 192.168.2.1 0 设置拒绝192.168.2.1的主机通过 记住将其应用到接口上 [AR2]acl 2000 //创建基本ACL [AR2-acl-basic-2000]rule deny source 192…

Fiddler的配置、原理和使用

一、Fiddler的工作原理 本地应用与服务器之间所有的请求&#xff08;request&#xff09;和响应&#xff08;response&#xff09;&#xff0c;由fiddler进行转发&#xff0c;此时fiddler以代理服务器的方式存在。 由于所有的网络数据都要经过fiddler&#xff0c;因此&#xf…

014 OpenCV canny边缘检测

一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、canny原理 OpenCV中的Canny边缘检测算法是一种基于图像处理的计算机视觉技术&#xff0c;主要用于检测图像中的边缘。Canny边缘检测算法的原理是通过计算图像中像素点之间的梯度值来…

SAP MIGO前台批次特性值增强(自动带出)<转载>

原文链接&#xff1a;https://blog.csdn.net/qq_45063256/article/details/128464411 增强点&#xff1a;程序LCTMSF3Z 在MIGO中点击批次右边的分类时&#xff0c;自动将该批次的批次特性值带出来。 现在打开程序LCTMSF3Z 该程序就只有一个FORM&#xff0c;首先切换到编辑…