LeetCode Hot100 - 3. 最长连续序列(Java 题解)
LeetCode Hot100 - 3. 最长连续序列(Java 题解)
题目链接
难度
中等
题目描述
给定一个未排序的整数数组 nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
解题思路
本题要求 O (n) 复杂度,因此不能排序(O (n log n)),最优解法为哈希集合 + 枚举连续序列起点。
- 先用
HashSet存入所有数字,实现 O (1) 查找并自动去重; - 只对连续序列的起点进行向后枚举:
- 若
num - 1不在集合中,说明num是一段连续序列的起点;
- 若
- 从起点开始,不断查找
curNum + 1是否存在,统计当前连续长度; - 维护全局最大长度,最终返回结果。
每个数字最多被访问两次,整体复杂度 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;
}
}
代码解释
-
HashSet 作用
快速判断数字是否存在,同时去重,避免重复计算。
-
起点判断(核心)
if (!set.contains(num - 1))只有起点才进入统计,避免重复遍历,保证 O (n) 效率。
-
向后扩展连续序列
从起点不断查找
curNum + 1,直到断连,记录长度。 -
更新最长长度
每次用
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
易错点
- 必须去重,否则重复数字会导致长度计算错误;
- 必须只从起点开始遍历,否则复杂度退化;
- 数组为空时要提前返回 0;
- 不能使用排序,否则不满足 O (n) 要求。
总结
本题是哈希表典型应用,核心思想是枚举连续序列起点 + 贪心向后扩展,代码简洁、效率最优,是面试高频题。
持续更新 LeetCode 热题100 题解(Java 版本),专注面试向,欢迎收藏关注~
浙公网安备 33010602011771号