并查集
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号