并查集
1、并查集是一种树形结构,用户处理不相交数据的合并和查询问题。
2.、并查集操作:
a,find 查询是否是同一颗数
b,树合并
3、算法模板
# 递归查parent,并赋值
def find(self, i, relation):
if not relation[i] == i:
relation[i] = self.find(relation[i], relation)
return relation[i]
# 合并操作,约定取值较小者
def union(self, i, j, relation):
re_i = self.find(i, relation)
re_j = self.find(j, relation)
if re_i < re_j:
relation[re_j] = re_i
elif re_i > re_j:
relation[re_i] = re_j
1、对关系,遍历执行 union操作
2、然后针对关系list,执行find,让所有元素找到最终的parent
3、例题
547. 朋友圈
https://leetcode-cn.com/problems/friend-circles/
class Solution:
def find(self, i, relation):
if not relation[i] == i:
relation[i] = self.find(relation[i], relation)
return relation[i]
def union(self, i, j, relation):
re_i = self.find(i, relation)
re_j = self.find(j, relation)
if re_i < re_j:
relation[re_j] = re_i
elif re_i > re_j:
relation[re_i] = re_j
def findCircleNum(self, M: List[List[int]]) -> int:
M_len = len(M[0])
relation = [i for i in range(M_len)]
for i in range(M_len):
for j in range(i + 1, M_len):
if M[i][j] == 1:
self.union(i, j, relation)
print(relation)
for i in range(len(M)):
self.find(i, relation)
return len(set(relation))

浙公网安备 33010602011771号