哈希3 : 最长连续序列

🔥个人主页: Milestone-里程碑

❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>>

<<Git>><<MySQL>>

🌟心向往之行必能至


题目回顾

给定一个未排序的整数数组 nums,我们需要找出其中数字连续的最长序列的长度,并且要求算法的时间复杂度为 O(n)

示例:

  • 输入:nums = [100,4,200,1,3,2]
  • 输出:4
  • 解释:最长连续序列是 [1, 2, 3, 4]

思路分析

这道题最直观的想法是先排序再遍历,但排序的时间复杂度是 O (n log n),无法满足题目要求。我们可以用哈希表来优化,核心思路是:

  1. 用哈希表存储所有数字:这样可以在 O (1) 时间内判断一个数是否存在。
  2. 只从序列的起点开始计算 :如果一个数 x 的前驱 x-1 不在哈希表中,说明 x 是一个连续序列的起点,我们就从 x 开始,不断寻找 x+1x+2...,直到找不到为止。
  3. 记录最长序列长度:每次找到一个起点,就计算当前序列的长度,并更新全局最长长度。

这个方法的时间复杂度是 O(n),因为每个数字最多被访问两次(一次被遍历,一次在寻找连续序列时被检查)。

完整代码实现

cpp

复制代码
class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        // 将数组元素存入哈希集合,去重并支持O(1)查找
        unordered_set<int> hash(nums.begin(), nums.end());
        int len = 0;
        
        for (int x : hash) {
            // 如果x-1存在,说明x不是序列起点,跳过
            if (hash.count(x - 1)) {
                continue;
            }
            // x是起点,开始寻找连续序列
            int y = x + 1;
            while (hash.count(y)) {
                ++y;
            }
            // 更新最长序列长度
            len = max(len, y - x);
        }
        
        return len;
    }
};

代码详解

  1. 哈希集合初始化

    cpp

    复制代码
    unordered_set<int> hash(nums.begin(), nums.end());

    将数组元素全部存入 unordered_set,自动去重,并且后续的 count 操作时间复杂度为 O (1)。

  2. 遍历哈希集合

    cpp

    复制代码
    for (int x : hash) {
        if (hash.count(x - 1)) continue;
        // ...
    }

    这一步是关键优化:只有当 x-1 不在集合中时,x 才是一个连续序列的起点,我们才会继续计算。这避免了对每个数字都进行一次完整的连续序列查找。

  3. 计算连续序列长度

    cpp

    复制代码
    int y = x + 1;
    while (hash.count(y)) ++y;
    len = max(len, y - x);

    从起点 x 开始,不断寻找下一个连续数字 y,直到找不到为止。此时 y - x 就是当前连续序列的长度,我们用它来更新最长长度 len

复杂度分析

  • 时间复杂度 :O (n)。虽然有嵌套的 while 循环,但每个数字最多被访问两次(一次在 for 循环中,一次在 while 循环中),因此总体时间复杂度是线性的。
  • 空间复杂度:O (n)。哈希集合需要存储所有数字,空间复杂度为 O (n)。

总结

这道题的核心在于避免重复计算 ,通过判断 x-1 是否存在,我们只从每个连续序列的起点开始计算,从而保证了算法的时间复杂度为 O (n)。这种思路在处理数组去重、连续序列等问题时非常实用。

相关推荐
小雨下雨的雨41 分钟前
井字棋AI机器人实现详解 - Minimax算法实战-鸿蒙PC Electron框架完成
前端·人工智能·算法·华为·electron·鸿蒙
xieliyu.3 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
love530love3 小时前
LiveTalking 数字人项目 Windows 部署完全指南(EPGF 架构)
人工智能·windows·python·架构·livetalking·epgf
遇事不決洛必達3 小时前
【Python基础】GIL 锁是什么及其对爬虫的影响
爬虫·python·线程·进程·gil锁
明夜之约3 小时前
Spring Boot 自动装配源码
java·spring boot·后端
Leaton Lee3 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程
java·spring boot·后端·架构
Jinkxs3 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用
java·spring boot·后端
辣机小司4 小时前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】
java·spring boot·后端·yaml·踩坑记录
一条小锦吕*4 小时前
基于Spring Boot + 数据可视化 + 协同过滤算法的推荐系统设计与实现(源码+论文+部署全讲解)
spring boot·算法·信息可视化
CryptoPP4 小时前
快速对接东京证券交易所API数据:实战指南与代码示例
开发语言·人工智能·windows·python·信息可视化·区块链