该题解使用了并查集的数据结构来解决问题。首先,每个数被初始化为一个集合,其中包含该数自身(作为父节点)和集合大小(初始为1)。接着,遍历所有数字,对于每个数字,检查其相邻的数字(num-1 和 num+1)是否也在数组中。如果相邻数字存在,通过union操作将当前数字与其相邻数字合并为一个集合。union操作中,确保小集合合并到大集合中,并更新集合的大小。最终,通过遍历所有数字,找到最大的集合大小,这就是最长连续序列的长度。
时间复杂度: O(n)
空间复杂度: O(n)
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
def findFather(num_map, i):
# 如果当前节点不是自己的父节点,递归找到根节点,并进行路径压缩
if num_map[i][0] !=i:
num_map[i][0] = findFather(num_map, num_map[i][0])
return num_map[i][0]
def union(num_map, i, j):
# 找到i和j的父节点
fatherI = findFather(num_map,i)
fatherJ = findFather(num_map,j)
#如果父节点不同,进行合并
if fatherI != fatherJ:
num_map[fatherI][0] = num_map[fatherJ][0]
num_map[fatherJ][1] += num_map[fatherI][1]
num_map = {}
# 初始化num_map,每个数字为一个集合
for num in nums:
num_map[num] = [num, 1] # father node, count in this cluster
# 遍历每个数字,尝试与相邻数字合并集合
for num in nums:
if (num-1) in num_map:
union(num_map, num-1, num)
if (num+1) in num_map:
union(num_map, num+1, num)
res = 0
# 找到最大的集合大小
for num in num_map:
res = max(res, num_map[num][1])
return res