1. 算法题:最长连续序列解析
这道经典算法题要求我们从一个未排序的整数数组中找出数字连续的最长序列长度。比如给定数组[100,4,200,1,3,2],最长连续序列是[1,2,3,4],返回长度4。
1.1 问题核心分析
这个问题看似简单,但有几个关键点需要注意:
- 序列必须是连续的整数
- 序列中的数字在原数组中可以不连续出现
- 时间复杂度要求通常是O(n)
最直观的解法是排序后遍历查找,但排序本身需要O(nlogn)时间,不满足要求。我们需要更高效的算法。
1.2 哈希表解法详解
最优解法是使用哈希集合(HashSet):
- 首先将所有数字存入哈希集合
- 然后遍历数组中的每个数字
- 对于每个数字,检查它是否是某个连续序列的起点(即num-1不在集合中)
- 如果是起点,则向后查找连续的数字,统计长度
- 记录最大的长度
python复制def longestConsecutive(nums):
num_set = set(nums)
max_length = 0
for num in num_set:
if num - 1 not in num_set: # 检查是否是序列起点
current_num = num
current_length = 1
while current_num + 1 in num_set: # 向后查找连续数字
current_num += 1
current_length += 1
max_length = max(max_length, current_length)
return max_length
1.3 复杂度分析
- 时间复杂度:O(n)
- 构建哈希集合O(n)
- 每个数字最多被访问两次(作为序列起点和中间元素)
- 空间复杂度:O(n)
- 需要存储哈希集合
1.4 实际应用场景
这种算法在以下场景很有用:
- 用户行为分析中查找连续活跃天数
- 日志分析中查找连续错误发生的时间段
- 游戏开发中统计连续成就达成
1.5 常见错误与优化
常见错误包括:
- 忘记处理空数组情况
- 重复数字处理不当
- 没有正确识别序列起点
优化技巧:
- 可以先过滤掉重复数字
- 对于超大数组,可以考虑分批处理
- 实际应用中可以加入early termination条件
1.6 变种问题
类似的问题变种包括:
- 查找最长递增子序列(非连续)
- 查找最长等差序列
- 二维矩阵中的最长连续路径
每种变种都需要不同的解法思路,但哈希表法在很多情况下仍然适用。
提示:面试中遇到这个问题时,建议先讨论暴力解法,再逐步优化到哈希表解法,展示思考过程。
