💻 [LeetCode Hot100] 最长连续序列🔥哈希表+双指针,Java实现!图文详解,小白也能秒懂!
✏️本文对应题目链接:最长连续序列
📌 题目描述
给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
示例:
输入:nums = [100, 4, 200, 1, 3, 2]
输出:4
解释:最长连续序列是 [1, 2, 3, 4],长度为 4。
🧠 解题思路(图文分解)
❗ 核心难点
如何高效找到连续序列的起点,并快速计算序列长度?
哈希表+双指针法(黄金思路)✨
关键步骤:
- 创建哈希表:存储所有数字,方便快速查找
- 遍历数组:找到每个连续序列的起点(即当前数字的前一个数不在哈希表中)
- 计算长度:从起点开始,向后查找连续的数字,直到中断
- 更新最大值:记录最长的连续序列长度
动态过程图解:
输入数组:[100, 4, 200, 1, 3, 2]
哈希表:{100, 4, 200, 1, 3, 2}
遍历到1:
- 1的前一个数0不在哈希表 → 1是起点
- 向后查找2,3,4 → 序列长度为4
🚀 代码实现
import java.util.*;
class Solution {
public int longestConsecutive(int[] nums) {
// 创建哈希表存储所有数字
Set<Integer> numSet = new HashSet<>();
for (int num : nums) {
numSet.add(num);
}
int longestStreak = 0; // 记录最长连续序列长度
// 遍历数组
for (int num : numSet) {
// 如果当前数字的前一个数不在哈希表中,说明它是连续序列的起点
if (!numSet.contains(num - 1)) {
int currentNum = num;
int currentStreak = 1;
// 向后查找连续的数字
while (numSet.contains(currentNum + 1)) {
currentNum += 1;
currentStreak += 1;
}
// 更新最长连续序列长度
longestStreak = Math.max(longestStreak, currentStreak);
}
}
return longestStreak;
}
}
💡 复杂度分析
- 时间复杂度:O(n) → 每个数字最多被访问两次(一次在哈希表中,一次在查找序列时)
- 空间复杂度:O(n) → 哈希表存储所有数字
🌟 总结要点
✅ 哈希表核心作用:快速判断数字是否存在
✅ 双指针思想:从起点向后扩展,计算序列长度
✅ 适用场景:需要快速查找和统计连续性的问题
🔥 下期预告:《移动零》双指针法轻松解决数组操作难题!