问题背景

给定一个未排序的整数数组 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)基础操作

集合是无序、不重复、可变的容器,非常适合用于去重和存在性检查。

s1 = {1, 2, 3}
s1.add(4)  # → {1, 2, 3, 4},添加单个元素
s1.update([5, 6])  # → {1, 2, 3, 4, 5, 6},批量添加元素

s1.remove(3)  # → {1, 2},删除元素,不存在则报错
s1.discard(3)  # → {1, 2},删除元素,不存在也不报错
s1.pop()  # 随机删除并返回一个元素
s1.clear()  # 清空整个集合

s1.remove(2)
s1.add(20)  # 先删后加,实现元素修改

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)。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐