这是我第一次用并查集相关的数据结构。
该题显然是要一次遍历给定数组,然后不断查看边的两个节点是否已经在一个集合里,是典型的并查集应用题。
在一开始,每个点都是一个独立的集合。每次迭代一条边,都会把两个集合合并起来,且是有方向地合并,这样才能在不断找parent的过程中,以唯一的root作为该集合的hash值。
并查集要维护这个集合,需要find和union两个函数。find,用于找到当前节点所在集合的唯一root,就是一直找它的parent。union,就是把两个节点所在的两个集合的两个root合一起,即把一个root本来指向自己的指向另一个root。
class Solution:
def findRedundantConnection(self, edges: List[List[int]]) -> List[int]:
n = len(edges)
parent = list(range(n + 1))
def find(index: int) -> int:
if parent[index] != index:
parent[index] = find(parent[index])
return parent[index]
def union(index1: int, index2: int):
parent[find(index1)] = find(index2)
for node1, node2 in edges:
if find(node1) != find(node2):
union(node1, node2)
else:
return [node1, node2]
return []