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

news2024/9/23 3:19:28

题目描述

给定一个未排序的整数数组 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.coloradmin.cn/o/2082656.html

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

相关文章

【STM32】STM介绍

一、嵌入式与STM32 1.嵌入式 除了桌面PC之外&#xff0c;所有的控制类设备&#xff0c;都称之嵌入式。 1 ARM概述 1.1 历史 1978年&#xff0c;物理学家赫尔曼豪泽&#xff08;Hermann Hauser&#xff09;和工程师Chris Curry&#xff0c;在英国剑桥创办了CPU公司&#xff…

识别不到开发板串口问题(故事版)

最近电脑重新刷机了&#xff0c;很多东西都没了&#xff0c;很伤心。但也是锻炼自己基本功的能力。 我在用vscode开发ESP32的时候&#xff0c;发现一直识别不到串口&#xff0c;很纳闷&#xff0c;以为笔记本端口坏了&#xff1f; 转念一想觉得是因为没有加驱动 当时下面有一…

大模型学习应用 3: AutoDL 平台 transformers 环境搭建及模型部署使用(持续更新中)

之前我们学习了在和鲸的预配置好的平台上进行学习&#xff0c;在工作中并不现实&#xff0c;本期我们的目标是将已有模型部署到云端进行运行 配置环境&#xff1a;RTX 4090D(24GB) python 3.12(ubuntu22.04) 参考文章:AutoDL平台transformers环境搭建 目录 注册及选择算力新建…

E6000物联网主机:打造智慧楼宇的未来

智慧楼宇&#xff0c;作为现代建筑领域的璀璨明星&#xff0c;正以其独特的魅力和强大的功能改变着我们的生活和工作方式。它并非简单的建筑与技术的叠加&#xff0c;而是通过先进的信息技术和智能化系统的深度融合&#xff0c;实现对建筑内各项设施和服务的高效管理与优化。 智…

Mac怎么安装谷歌浏览器

谷歌浏览器凭借其强大的功能&#xff0c;成为广大用户的首选浏览器。其中Mac用户在进行下载和安装时&#xff0c;可能会出现一些困难。为了帮助大家顺利的在Mac系统中成功安装&#xff0c;下面就给大家详细分享Mac安装谷歌浏览器指南&#xff0c;希望对你有所帮助。 Mac安装谷歌…

xss-labs通关攻略 16-20关

第16关 ?keyword<img%0asrc"1.jpg"%0aοnerrοralert(1)> 第17关 查看源代码 输入 ?arg01a&arg02 οnmοuseοveralert("aini") 第18关 直接输入 ?arg01a&arg02 οnmοuseοveralert("aini") 第19关 需要下载一个flash 输…

国内纵向科研项目梳理

文章目录 1. 2023 年以后2. 2023 年以前2.1 国家重点研发计划2.1.1 重点专项 2.2 国家科技重大专项 3. 附&#xff1a;国家级和省部级科研项目列表 1. 2023 年以后 2023 年&#xff0c;根据新的国务院机构改革方案&#xff0c;科技部现有的多项管理职责和多个下属机构都将被分…

6款自动生成文章的软件,生成文章好用、操作简单

作为一名专业创作者&#xff0c;我深知内容生产的压力和挑战。在追求效率的同时&#xff0c;保持文章的质量和原创性是至关重要的。最近&#xff0c;我亲测了6款自动生成文章的软件&#xff0c;发现它们不仅操作简便&#xff0c;而且生成的文章质量令人满意。以下是我对这6款软…

ctfhub-web-SSRF(FastCGI协议-DNS重绑定 Bypass)

less-6 FastCGI协议 步骤一&#xff1a;开启环境&#xff0c;查看提示 步骤二&#xff1a;对一句话木马进行base64编码&#xff1a;<?php eval($_POST[cmd]);?> echo "PD9waHAgQGV2YWwoJF9QT1NUW2NtZF0pOz8" | base64 -d > 1.php 步骤三&#xff1a;利…

#C++ 笔记一

重点&#xff1a;面试考试大概率会涉及&#xff0c;需要不借助任何资料掌握。 掌握&#xff1a;面试考试可能涉及&#xff0c;需要不借助任何资料掌握 熟悉&#xff1a;面试考试可能涉及&#xff0c;可以稍微参考资料掌握 了解&#xff1a;面试考试小概率涉及&#xff0c;能吹吹…

获取文件属性/库Lib

获取文件属性 stat 函数 man 2 stat #include <sys/types.h> #include <sys/stat.h> #include <unistd.h>int stat(const char *path, struct stat *buf); 功能&#xff1a;获取文件属性 参数&#xff1a; path&#xff1a;文件路径名buf&#xff1a;保存文…

最新黑名单查询录入系统_全开源源码

最新黑名单查询录入系统_全开源源码 前端html 后端layui 操作部分都采用API接口的方式实线 集结了layui表格的多数据操作&#xff0c;添加&#xff0c;批量删除&#xff0c;分页&#xff0c;单项删除 后台数据修改采用绑定参数的形式来进行修改可以很好的预防数据库注入…

【Python入门】第3节 循环语句

&#x1f4d6;第3节 循环语句 ✅while循环的基础语法✅while循环的嵌套✅while循环的嵌套案例✅for循环的基础语法&#x1f9ca;基础语法&#x1f9ca;range语句&#x1f9ca;变量作用域 ✅for循环的嵌套应用✅循环中断 : break和continue ✅while循环的基础语法 只要条件满足…

Thread的属性和方法及如何中断一个线程

文章目录 一. Thread提供的属性和方法1. Thread常见的构造方法2. 属性及获取方法 二. 中断(终止)一个线程1) 自己来实现控制线程结束的例子2) 使用Thread提供的interrupt和isInterrupted方法来实现控制线程结束 一. Thread提供的属性和方法 1. Thread常见的构造方法 ③ 在创建…

戏曲多多 v1.0.4 — 专为老年人打造的戏曲娱乐软件(含经典评书与广场舞)

戏曲多多 TV 是一款专为老年人量身打造的视频娱乐软件&#xff0c;安装在智能电视、智能机顶盒、投影仪等安卓系统设备上后&#xff0c;老年人可以在电视上轻松观看各种戏曲视频。软件涵盖豫剧、京剧、秦腔、越剧、昆曲、淮剧、川剧、黄梅戏等多种戏曲类型。除了戏曲&#xff0…

Java设计模式之原型模式详细讲解和案例示范

引言 在软件设计中&#xff0c;设计模式为我们提供了可复用的解决方案&#xff0c;以应对常见的设计问题。原型模式&#xff08;Prototype Pattern&#xff09;是创建型设计模式的一种&#xff0c;它允许通过复制现有对象来创建新对象&#xff0c;而不需要了解创建过程的细节。…

【软件】常用软件教程一:码云(Gitee)使用方法

文章目录 一、简介二、创建远程仓库三、配置SSH公钥四、同步 Gitee 仓库内容到本地五、本地新建文件并同步至 Gitee六、删除远程仓库中的指定文件七、常见代码 一、简介 Git 是一种分布式版本控制系统&#xff0c;用于跟踪和管理代码的变更。它是由 Linus Torvalds 创建的&…

ctfhub-web-SSRF(内网访问-上传文件)

www.ctfhub.com less-1 内网访问 步骤一&#xff1a;开启环境&#xff0c;查看提示 步骤二&#xff1a;输入urlhttp://127.0.0.1/flag.php 得出结果 显示提交成功 less-2 伪协议读取文件 步骤一&#xff1a;开启环境&#xff0c;查看提示 步骤二&#xff1a;输入urlfile://…

英伟达财报引爆AI投资狂潮?华尔街众说纷纭

英伟达&#xff0c;这个名字最近可是火爆了整个科技圈。作为全球最大的GPU供应商&#xff0c;英伟达的每一次动作都牵动着无数投资者的神经。尤其是即将到来的财报发布&#xff0c;更是让市场充满了期待和忐忑。 华尔街聚焦&#xff1a;AI巨头能否持续高增长&#xff1f; 整个…

背完这些软件测试核心面试题,offer轻松拿捏了!

你赞同过 软件测试和开发 相关内容 01、您所熟悉的测试用例设计方法都有哪些&#xff1f;请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。 答&#xff1a;有黑盒和白盒两种测试种类&#xff0c;黑盒有等价类划分法&#xff0c;边界分析法&#xff0c;因果图法…