1. 问题背景与核心思路
这道题目要求我们找出一个未排序整数数组中最长的连续数字序列的长度。比如给定数组[100,4,200,1,3,2],最长的连续序列是[1,2,3,4],所以返回长度4。题目要求时间复杂度为O(n),这意味着我们不能简单地排序后遍历(排序需要O(nlogn)时间)。
关键提示:连续序列的定义是数值连续递增,但元素在原始数组中的位置可以任意
我最初尝试用排序解法时发现虽然能通过部分测试用例,但遇到大数据集时就会超时。这让我意识到必须寻找更高效的算法,而哈希表(HashSet)正是解决这类查找问题的利器。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 哈希表解法详解
2.1 基础数据结构选择
使用HashSet存储所有数字是核心思路。在Java中我们可以这样初始化:
java复制Set<Integer> numSet = new HashSet<>();
for (int num : nums) {
numSet.add(num);
}
选择HashSet的原因有三:
- O(1)时间复杂度的contains操作
- 自动去重,避免重复计算
- 空间复杂度O(n),在可接受范围内
2.2 算法流程拆解
完整算法步骤如下:
- 将所有数字存入HashSet(去重)
- 遍历数组中的每个数字num
- 如果num-1不存在于集合中,说明num可能是一个序列的起点
- 从num开始,连续检查num+1、num+2...是否在集合中
- 记录当前连续序列长度
- 更新全局最大长度
关键代码实现:
java复制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;
}
longestStr
