【力扣-128. 最长连续序列】Python笔记

7 阅读2分钟

一、问题背景

给定一个未排序的整数数组 nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

示例

  • 输入nums = [100, 4, 200, 1, 3, 2]
  • 输出4
  • 解释:最长连续数字序列是 [1, 2, 3, 4],长度为 4。

二、核心思路:哈希集合优化查找

算法思想

  1. 去重与快速查找:将数组转换为集合(set),实现 O (1) 时间复杂度的存在性检查。
  2. 寻找序列起点:遍历每个数字 num,只有当 num-1 不在集合中时,num 才是一个连续序列的起点。
  3. 扩展序列:从起点 num 开始,不断查找 num+1, num+2... 直到找不到为止,记录当前序列长度。
  4. 更新最大值:在所有序列长度中取最大值,即为结果。

时间复杂度: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_setO (1) 时间复杂度判断元素是否存在
num - 1 not in num_set判断 num 是否为连续序列的起点
max(a, b)更新最长序列长度

六、算法优化点

  • 避免重复计算:只从序列起点开始计数,保证每个数字只被处理一次。
  • 空间换时间:利用集合的 O (1) 查找特性,将暴力解法的 O (n²) 优化至 O (n)。