跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

哈希集合巧解最长连续序列

给定未排序整数数组,需找出数字连续的最长序列长度,且时间复杂度须为 O(n)。采用哈希集合存储元素以实现 O(1) 查找。遍历集合,仅当某数前驱不存在时将其视为序列起点,向后扩展统计长度并更新全局最大值。此策略避免重复遍历,保证整体线性时间复杂度,空间开销与数组长度成正比,是解决该问题的最优方案之一。

筑梦师发布于 2026/1/31更新于 2026/9/1059 浏览
哈希集合巧解最长连续序列

一、题目回顾

LeetCode 128 题「最长连续序列」是一道中等难度的数组题,核心要求如下:给定一个未排序的整数数组 nums,找出其中数字连续的最长序列(不要求序列元素在原数组中连续)的长度,且必须设计时间复杂度为 O(n) 的算法。

示例直观理解:

  • 输入 nums = [100,4,200,1,3,2],输出 4(最长序列是 [1,2,3,4]);
  • 输入 nums = [0,3,7,2,5,8,4,6,0,1],输出 9(完整连续序列 0-8)。

二、解法思路:哈希集合 + 起点判定

题目要求 O(n) 时间,因此不能用排序(排序时间 O(nlogn)),需要借助「哈希集合」的快速查找特性(查找操作 O(1))。

核心思路是:

  1. 将数组元素存入哈希集合,实现'是否存在某数'的快速判断;
  2. 遍历集合中的每个数 x,仅当 x-1 不在集合中时,才将 x 作为'连续序列的起点';
  3. 从起点 x 开始,依次查找 x+1、x+2... 是否在集合中,统计该序列的长度;
  4. 维护一个全局变量,记录所有序列的最长长度。

这个思路的巧妙之处在于:非起点的数会被跳过,每个数只会被遍历一次,从而保证整体时间复杂度为 O(n)。

三、C++ 代码解析

先看完整代码,再逐行拆解:

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        // 1. 将数组元素存入哈希集合(去重 + 快速查找)
        unordered_set<int> hash(nums.begin(), nums.end());
        int len = 0; // 记录最长序列长度

        // 2. 遍历集合中的每个数
        for (int x : hash) {
            // 3. 仅当 x-1 不存在时,x 才是序列起点(避免重复计算)
            if (hash.count(x - 1)) {
                continue;
            }
            
             y = x + ;
             (hash.(y)) {
                ++y;
            }
            
            len = (len, y - x);
        }
         len;
    }
};
// 4. 从起点 x 开始,扩展连续序列
int
1
while
count
// 5. 更新最长长度(y-x 是当前序列的长度)
max
return
代码关键细节
  1. 哈希集合的作用:
    • 用 unordered_set 存储数组元素,既实现了去重(重复元素不影响连续序列长度),又能在 O(1) 时间内判断某数是否存在。
  2. 起点判定逻辑:
    • if (hash.count(x - 1)) continue;:如果 x-1 存在,说明 x 不是当前连续序列的起点(比如 x=2 时,若 x-1=1 存在,则 2 属于以 1 为起点的序列),直接跳过,避免重复遍历。
  3. 序列长度计算:
    • 从起点 x 出发,用 y 不断向后扩展(y++),直到 y 不在集合中,此时 y - x 就是当前连续序列的长度。

四、复杂度分析

  • 时间复杂度:O(n)
    • 存入集合的时间是 O(n);
    • 遍历集合时,每个元素最多被访问 1 次(只有起点会触发后续的扩展循环,非起点会被跳过),因此整体遍历时间是 O(n)。
  • 空间复杂度:O(n)
    • 哈希集合存储了数组的所有元素,空间开销与数组长度成正比。

五、解法小结

这个解法的核心是通过'起点判定'避免重复计算,结合哈希集合的快速查找,既满足了 O(n) 的时间要求,又保证了逻辑的简洁性。

相比暴力解法(枚举每个数后遍历后续元素,时间 O(n²)),这个方法用空间换时间,是这道题的最优解之一。

目录

  1. 一、题目回顾
  2. 二、解法思路:哈希集合 + 起点判定
  3. 三、C++ 代码解析
  4. 代码关键细节
  5. 四、复杂度分析
  6. 五、解法小结

更多推荐文章

查看全部
  • 动态规划专题:子序列问题解析
  • JavaScript Response 对象详解与使用指南
  • C++ 哈希表详解:概念、哈希函数与冲突解决
  • AI 生成 UI 设计工具盘点:主流平台与免费额度参考
  • VS Code 远程连接服务器后 GitHub Copilot 无法使用问题的解决方案
  • 基于 Redis 与 Caffeine 的图片系统性能优化及分布式 Session 实践
  • RAG 应用落地关键痛点与解决策略分析
  • 配置 Obsidian Git 插件实现本地笔记同步至 GitHub 仓库 (Mac)
  • 实测 6 款国产大模型实用性:长文本与多模态能力横向对比
  • OpenHarmony 使用 shelf_web_socket 构建 WebSocket 服务端实战
  • MySQL 核心知识点与架构解析
  • 项目分享|LiveKit Agents Playground:快速搭建WebRTC服务端Agent原型的利器
  • 本地部署 DeepSeek R1 并集成至 Dify 完整指南
  • 港大开源大模型 RAG 系统 LightRAG 技术解析
  • RoboBrain 2.0 具身大脑模型复现指南:统一感知、推理与规划
  • Python 数据分析、可视化与机器学习速查表汇总
  • Silly Tavern 角色卡与世界书导入教程
  • Python Web 框架深度解析:Django、Flask 与 FastAPI 选型指南
  • 近五年体内微/纳米机器人赋能肿瘤精准治疗综述:聚焦胶质母细胞瘤
  • 主流大模型横评:GPT、Claude、Gemini、Llama 及国产模型选型指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online