最长连续序列
问题描述
LeetCode 128.最长连续序列
给定一个未排序的整数数组 nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
解决思路
要解决这个问题,可以使用哈希表来存储数组中的数,并通过遍历数组来寻找连续序列。具体解决步骤如下:
-
创建一个哈希表
num_set,用于存储数组中的数。 -
初始化变量
longseq为 0,用于记录最长连续序列的长度。 -
遍历数组
nums中的每个数num:- 首先检查
num - 1是否在num_set中,如果不在,则说明num可以作为一个连续序列的起点。 - 如果
num - 1不在num_set中,表示以num为起点的连续序列开始了,初始化current_seq为 1,并初始化current_num为num。 - 在内层循环中,不断检查
current_num + 1是否在num_set中,如果存在,表示连续序列继续,将current_seq自增,current_num自增。 - 如果连续序列的长度
current_seq大于longseq,则更新longseq。
- 首先检查
-
返回
longseq作为最长连续序列的长度。
代码实现
以下是使用Python编写的代码,实现了上述解决思路,并添加了注释以解释每个步骤:
class Solution:
def longestConsecutive(self, nums):
# 初始化最长连续序列的长度为0
longseq = 0
# 创建一个哈希表,用于存储数组中的数
num_set = set(nums)
# 遍历数组中的每个数
for num in nums:
# 如果 num - 1 不在 num_set 中,表示 num 可以作为连续序列的起点
if num - 1 not in num_set:
current_seq = 1
current_num = num
# 在内层循环中检查连续序列的长度
while current_num + 1 in num_set:
current_seq += 1
current_num += 1
# 更新最长连续序列的长度
if longseq < current_seq:
longseq = current_seq
# 返回最长连续序列的长度
return longseq
时间复杂度分析
这个算法需要遍历数组 nums,对于每个数的查找操作可以在常数时间内完成,因此时间复杂度是 O(n),其中 n 是数组的长度。
空间复杂度分析
这个算法使用了一个哈希表 num_set 来存储数组中的数,哈希表的空间复杂度取决于数组中不同元素的数量,最坏情况下为 O(n)。因此,空间复杂度是 O(n)。
结论
最长连续序列问题是一个有趣的问题,通过使用哈希表和巧妙的遍历方法,可以在线性时间内解决。这个算法的时间复杂度和空间复杂度都在合理范围内,适用于大多数情况。希望这篇博客能够帮助你更好地理解和解决最长连续序列问题。
1269

被折叠的 条评论
为什么被折叠?



