LeetCode Hot100 - 3. 最长连续序列(Java 题解)

LeetCode Hot100 - 3. 最长连续序列(Java 题解)

题目链接

最长连续序列 - LeetCode

难度

中等

题目描述

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

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

解题思路

本题要求 O (n) 复杂度,因此不能排序(O (n log n)),最优解法为哈希集合 + 枚举连续序列起点

  1. 先用 HashSet 存入所有数字,实现 O (1) 查找并自动去重;
  2. 只对连续序列的起点进行向后枚举:
    • num - 1 不在集合中,说明 num 是一段连续序列的起点;
  3. 从起点开始,不断查找 curNum + 1 是否存在,统计当前连续长度;
  4. 维护全局最大长度,最终返回结果。

每个数字最多被访问两次,整体复杂度 O (n)。

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

解题代码(Java)

import java.util.HashSet;
import java.util.Set;

class Solution {
    public int longestConsecutive(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }

        int result = 0;
        Set<Integer> set = new HashSet<>();

        for (int num : nums) {
            set.add(num);
        }

        for (int num : set) {
            // 判断是否为连续序列的起点
            if (!set.contains(num - 1)) {
                int curNum = num;
                int curStream = 1;

                // 向后查找连续数字
                while (set.contains(curNum + 1)) {
                    curNum++;
                    curStream++;
                }

                result = Math.max(result, curStream);
            }
        }

        return result;
    }
}

代码解释

  1. HashSet 作用

    快速判断数字是否存在,同时去重,避免重复计算。

  2. 起点判断(核心)

    if (!set.contains(num - 1))

    只有起点才进入统计,避免重复遍历,保证 O (n) 效率。

  3. 向后扩展连续序列

    从起点不断查找 curNum + 1,直到断连,记录长度。

  4. 更新最长长度

    每次用 Math.max 更新全局最长连续序列长度。

示例演示

输入:nums = [100,4,200,1,3,2]

  • 集合:{100,4,200,1,3,2}
  • 100:无 99 → 长度 1
  • 4:有 3 → 跳过
  • 200:无 199 → 长度 1
  • 1:无 0 → 起点,连续找到 2、3、4 → 长度 4

最长连续序列:[1,2,3,4]

输出:4

易错点

  1. 必须去重,否则重复数字会导致长度计算错误;
  2. 必须只从起点开始遍历,否则复杂度退化;
  3. 数组为空时要提前返回 0;
  4. 不能使用排序,否则不满足 O (n) 要求。

总结

本题是哈希表典型应用,核心思想是枚举连续序列起点 + 贪心向后扩展,代码简洁、效率最优,是面试高频题。

持续更新 LeetCode 热题100 题解(Java 版本),专注面试向,欢迎收藏关注~

posted @ 2026-04-13 10:46  ZhenyangQ  阅读(5)  评论(0)    收藏  举报