并查集

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))

  

 

https://blog.csdn.net/qq_41593380/article/details/81146850

https://blog.csdn.net/yangrujing/article/details/51868630

posted @ 2020-05-05 01:05  哈哈哈喽喽喽  阅读(62)  评论(0)    收藏  举报