一、问题背景
给定一个未排序的整数数组 nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
示例:
- 输入:
nums = [100, 4, 200, 1, 3, 2] - 输出:
4 - 解释:最长连续数字序列是
[1, 2, 3, 4],长度为 4。
二、核心思路:哈希集合优化查找
算法思想
- 去重与快速查找:将数组转换为集合(
set),实现 O (1) 时间复杂度的存在性检查。 - 寻找序列起点:遍历每个数字
num,只有当num-1不在集合中时,num才是一个连续序列的起点。 - 扩展序列:从起点
num开始,不断查找num+1,num+2... 直到找不到为止,记录当前序列长度。 - 更新最大值:在所有序列长度中取最大值,即为结果。
时间复杂度:O (n)(每个数字最多被访问两次:一次作为起点,一次在扩展中被跳过)空间复杂度:O (n)(存储集合)
三、代码实现
class Solution:
def longestConsecutive(self, nums: list[int]) -> int:
# 转换为集合,去重并实现O(1)查找
num_set = set(nums)
len_max = 0
for num in num_set:
# 只有当前一个数不存在时,才开始计数(避免重复计算)
if num - 1 not in num_set:
current_num = num
current_max = 1
# 不断查找下一个数是否存在
while current_num + 1 in num_set:
current_num += 1
current_max += 1
# 更新最大长度
len_max = max(len_max, current_max)
return len_max
四、Python 集合(set)基础操作
集合是无序、不重复、可变的容器,非常适合用于去重和存在性检查。
1. 增
s1 = {1, 2, 3}
s1.add(4) # → {1, 2, 3, 4},添加单个元素
s1.update([5, 6]) # → {1, 2, 3, 4, 5, 6},批量添加元素
2. 删
s1.remove(3) # → {1, 2},删除元素,不存在则报错
s1.discard(3) # → {1, 2},删除元素,不存在也不报错
s1.pop() # 随机删除并返回一个元素 s1.clear() # 清空整个集合
3. 改
s1.remove(2)
s1.add(20) # 先删后加,实现元素修改
4. 查
print(2 in s1) # → True / False,O(1)时间复杂度
五、关键知识点总结
| 操作 | 说明 |
|---|---|
set(nums) | 将列表转换为集合,自动去重 |
num in num_set | O (1) 时间复杂度判断元素是否存在 |
num - 1 not in num_set | 判断 num 是否为连续序列的起点 |
max(a, b) | 更新最长序列长度 |
六、算法优化点
- 避免重复计算:只从序列起点开始计数,保证每个数字只被处理一次。
- 空间换时间:利用集合的 O (1) 查找特性,将暴力解法的 O (n²) 优化至 O (n)。