#LeetCode# 128.最长连续序列 (哈希+前驱数判定)

题目描述

给定一个未排序的整数数组 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

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109

思路

题目最大难点在于设计出时间复杂度为 O(n) 的算法解决此问题。

从示例看出序列有重复元素,第一步就是通过哈希去重;

unordered_set<int> hash;

经过哈希去重后,元素还是无序的,如果采用快排的情况,此题的时间复杂度就不符合O(n) 的要求了。

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

// 比如当前遍历的元素为 10
// 我只需要加多一层循环去判定 11 是否在哈希表中,12 是否在哈希表中...
// 每存在一个连续元素,连续序列长度就 +1

用一个哈希表存储数组中的数,这样查看一个数是否存在即能优化至 O(1) 的时间复杂度。

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

// 假如这个哈希表中存在 [11  12  13]
// 第一次遍历的元素是 11 ,此时循环就会寻找哈希表是否存在 12、13、14 ...
// 第二次遍历的元素是 12 ,此时循环就会寻找哈希表是否存在 13、14、15 ...
// 第三次遍历的元素是 13 ,此时循环就会寻找哈希表是否存在 14、15、16 ...// 从这里可以看到, 13 一共被其他元素寻找了两次,这就是多出来的不必要枚举

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

代码实现

class Solution {
public:int longestConsecutive(vector<int>& nums) {// 哈希表unordered_set<int> hash;// 将 nums 中的元素存入哈希表去重for (auto& e : nums) {hash.insert(e);}// 定义 局部连续长度、最大连续长度int maxlen = 0;int len = 0;// 开始遍历哈希表for (auto& num : hash) {// 如果当前遍历元素 x ,在哈希表中找到它的前驱数 x-1 ,则跳过if (hash.find(num - 1) != hash.end()) {continue;}// 确保 x 没有前驱数int n = num;// 循环寻找最大连续长度while (hash.find(n++) != hash.end()) {++len;}maxlen = max(maxlen, len);len = 0;}return maxlen;}
};

复杂度分析

时间复杂度:O(n),其中 n 为数组的长度。具体分析已在上面正文中给出。

空间复杂度:O(n),哈希表存储数组中所有的数需要 O(n) 的空间。

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

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

相关文章

Python常见字典与异常处理错误与解决方案

在Python中&#xff0c;字典&#xff08;dict&#xff09;和异常处理&#xff08;try...except&#xff09;是编程中常用的两个概念。字典用于存储键值对&#xff0c;而异常处理用于捕获和处理程序运行时可能出现的错误。下面我将列出9个常见的字典相关错误和异常处理相关的错误…

OPENAI开放微调功能

2023年8月23日&#xff0c;OpenAI宣布推出基于GPT-3.5 Turbo的微调功能并更新API&#xff0c;让企业、开发人员能够使用自身数据定制ChatGPT。 微调&#xff08;Fine-tuning&#xff09;是一种利用已有通用语言模型&#xff08;如GPT-3.5&#xff09;来训练一个特定模型的方法…

【freeDiameter】服务端和客户端的连接流程

连接流程详解 进程启动时&#xff0c;先使用main_cmdline解析命令行参数&#xff0c;比如使用-c就会使用指定路径的配置文件&#xff0c;使用-d就会启用后台进程。 之后使用fd_core_initialize初始化核心库。具体会先使用fd_conf_init初始化配置&#xff0c;比如设置各项的默…

最长的一帧学习 part3

文章目录 八、osgUtil:: SceneView::cull ()part1 初始化必要的SceneView类成员变量part2 立体显示的处理part3 执行SceneView::cullStage函数&#xff0c;它也是场景视图筛选工作的核心函数part3.1 首先统计场景中的遮挡节点&#xff08;OccluderNode&#xff09;&#xff0c;…

缺失ffmpeg.dll要用什么修复方法?快速恢复丢失的ffmpeg.dll文件

多媒体软件用户常常会遭遇一个提示&#xff1a;系统无法找到ffmpeg.dll文件。这类情况经常在启动视频编辑软件、流媒体播放应用或其他音视频处理工具时出现&#xff0c;导致相关程序无法正确加载和执行。ffmpeg.dll是一种关键的动态链接库文件&#xff0c;负责处理复杂的视频和…

ssrf+redis未授权访问漏洞复现

ssrfredis未授权访问漏洞复现 一&#xff0c;pikachu靶场练习 docker拉取环境&#xff1a; docker run -d -p 8765:80 8023/pikachu-expect:latest国内很多加速源都用不成&#xff0c;配置代理拉取即可&#xff0c;配置方式如下&#xff1a; 1&#xff0c;新建目录 mkdir -…

Spring Boot如何解决跨域问题?

1.什么是跨域&#xff1f; 跨域请求&#xff0c;就是说浏览器在执行脚本文件的ajax请求时&#xff0c;脚本文件所在的服务地址和请求的服务地址不一样。说白了就是ip、网络协议、端口都一样的时候&#xff0c;就是同一个域&#xff0c;否则就是跨域。这是由于Netscape提出一个…

数据结构与算法的代码实现(C++版)

数据结构与算法的代码实现&#xff08;C版&#xff09; 1. 线性表的顺序表示和实现1.1 线性表的初始化1.2 线性表的销毁1.3 线性表的清空1.4 线性表的长度1.5 判断线性表是否为空1.6 线性表的线性表取值1.7 线性表的顺序查找1.8 线性表的插入1.9 线性表的删除总结 2. 线性表的链…

JavaScript ES6+ 新特性

JavaScript ES6 新特性 引言 随着前端技术的不断发展&#xff0c;JavaScript 语言也在不断演进。自 ES6&#xff08;ES2015&#xff09;发布以来&#xff0c;JavaScript 引入了许多新的特性和语法&#xff0c;极大地提升了开发者的编程体验和代码的可维护性。本篇文章将详细探…

真话有危险,测评需谨慎!一个家最大的内耗:谁都在抱怨,没人肯改变——早读(逆天打工人爬取热门微信文章解读)

现在都这么完了吗&#xff1f; 引言Python 代码第一篇 洞见 一个家最大的内耗&#xff1a;谁都在抱怨&#xff0c;没人肯改变第二篇 故事风云录结尾 引言 慢慢调整时间 一是现在有点忙 做那个传播声音的研究实验实在是有点没有头绪 没有头绪的事情你就不知道怎么安排时间 也就…

3144. 分割字符频率相等的最少子字符串(24.8.28)

题目 题目&#xff1a; 给你一个字符串 s &#xff0c;你需要将它分割成一个或者更多的平衡子字符串。 比方说&#xff0c;s "ababcc" 那么 ("abab","c","c") &#xff0c;("ab","abc","c") 和 (&quo…

数学建模比赛(国赛)水奖攻略

之前很多同学私聊问我&#xff0c;学校要求参加数模比赛&#xff0c;但是不擅长建模编程&#xff0c;但又不想浪费这个时间该怎么办呢&#xff0c;今天就来给大家讲一下大家都非常感兴趣的内容——数学建模水奖攻略。分享一下博主直接参加比赛时候的经验。 一、选题技巧 有一句…

HarmonyOs如何获取rawfile目录下的所有文件列表

最近在做一个功能&#xff0c;需要使用获取rawfile下目录的所有文件 参考连接为&#xff1a; zRawfile-模块-C API-Localization Kit&#xff08;本地化开发服务&#xff09;-应用框架 - 华为HarmonyOS开发者 (huawei.com) 需要使用到native实现&#xff0c;实现步骤&#…

2008-2020年 中国健康与养老追踪调查CHARLS数据合集

中国健康与养老追踪调查&#xff08;China Health and Retirement Longitudinal Study, CHARLS&#xff09;是一项由北京大学国家发展研究院主持的大型跨学科调查项目。该项目始于2011年&#xff0c;每两到三年对样本进行一次追踪调查&#xff0c;旨在收集代表中国45岁及以上中…

在CentOS 7上安装MongoDB的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 MongoDB 是一个免费、开源的面向文档的数据库。它被归类为 NoSQL 数据库&#xff0c;因为它不依赖于传统的基于表的关系数据库结构…

C++_CH13_面向对象编程

C_CH13_面向对象编程 1.1 类 类&#xff08;class&#xff09;是数据和操作的组合。 我们以游戏角色为例&#xff0c;创建一个类 #include<iostream>class player//player这个类是我们自定义的一个类型 {int x;int y;//二维坐标int speed;//速度int power;//力量};int…

重载与重写:Java中方法的多态性

重载与重写&#xff1a;Java中方法的多态性 引言 在Java编程语言中&#xff0c;多态性是一个核心概念&#xff0c;它允许我们以统一的方式处理不同类型的对象。Java提供了两种实现多态性的方法&#xff1a;重载&#xff08;Overloading&#xff09;和重写&#xff08;Overrid…

面试经典算法150题系列-反转字符串中的单词

反转字符串中的单词 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能…

react 中的useState useEffect

下面的这些hook我们常用的一些 useState useEffect useCallback、useMemo、useRef 和 useContex 下一个文章中讲述&#xff08;useCallback、useMemo、useRef 和 useContex&#xff09; 下面我将讲解什么时候使用是最好的 首先我们需要明确的一点是&#xff0c;这些hook都…

转-600条最强linux命令

一、基本命令 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作系统信息 arch 显示机器的处理器架构 uname -…