【力扣-128. 最长连续序列】Python笔记
·
问题背景
给定一个未排序的整数数组 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)。
更多推荐


所有评论(0)