🇨🇳
阿臻的学习笔记
  • 🤖AI
    • 📑README
    • 🕒Scheduling
      • 一种JSSP的DRL环境
    • 📜Paper
      • 神经协同过滤
      • 非侵入信号深度学习
      • 肾透析移植机器学习
      • 心理学随机森林
      • P300数据学习
    • ⚒️Pytorch
      • 1.1数据基础
      • 1.2自动梯度
      • 1.3神经网络
      • 1.4模型实现
      • 2数据操作
    • 🛠️Ray+Gym
    • 📃Graph Neural
      • 图神经网络基础
      • Contrastive Multi-View Representation Learning on Graphs
    • 📽️Deep Learning
      • 《第一章》
      • 《第二章》
      • 《第三章》
      • 《第四章》
      • 台湾陈蕴侬视频2020
    • 🔨MXNet
      • 《第一章》《第二章》
      • 《第三章》
      • 《第四章》
      • 《第五章》
      • 《第六章》
      • 《第七章》
      • 《第八章》
      • 《第九章》
      • 《第十章》
  • 👨‍🏭Study
    • 📔Algorithm
      • Leetcode
        • 第一天(乱刷)
        • 第二天(栈)
        • 第三天(栈)
        • 第四天(堆)(贪心)
        • 第五天(贪心)
        • 第六天(贪心)
        • 第七天(排序)
        • 第八天(排序)
        • 第九天(排序)
        • 第十天(位运算)
        • 第十一天(位运算)
        • 第十二天(位运算)
        • 第十三天(位运算)
        • 第十四天(树)
        • 第十五天(树)
        • 第十六天(树)
        • 第十七天(树)
        • 第十八天(树)
        • 第十九天(树)
        • 第二十天(树)
        • 第二十一天(树)
        • 第二十二天(并查集)
        • 第二十三天(并查集)
        • 第二十四天(DFS)(图)
        • 第二十五天(图)(设计)
        • 第二十六天(拓扑)
        • 第二十七天(字典树)
        • 第二十八天(字典树)
        • 第二十九天(树状数组)(二叉搜索树)
        • 第三十天(递归)
        • 第三十一天(脑筋急转弯)
        • 第三十二天(脑筋急转弯)
        • 第三十三天(记忆化)
        • 第三十四天(队列)
        • 第三十五天(队列)
        • 第三十六天(极小化极大)
        • 第三十七天(几何)
        • 第三十八天(蓄水池抽样)
        • 第三十九天(数组)
        • 第四十天(数组)
        • 第四十一天(数组)
        • 第四十二天(数组)
        • 第四十三天(数组)
        • 第四十四天(数组)
        • 第四十五天(数组)
        • 第四十六天(数组)
      • Sort
        • 最小堆
        • 归并排序(merge_sort)
    • 📓Knowledge
      • python补码
    • 🔧Other
      • pythonic语法
      • Ubuntu备忘
由 GitBook 提供支持
在本页

这有帮助吗?

导出为 PDF
  1. Study
  2. Algorithm
  3. Leetcode

第二十二天(并查集)

上一页第二十一天(树)下一页第二十三天(并查集)

最后更新于3年前

这有帮助吗?

今天完成题目:957,684 957:由写斜杠划分区域

  • 将每个方框设为四个三角形

  • 根据斜杠的方向来合并01,23或02,13

  • 根据有无右下结点来合并25,38

  • 之后并查集的父结点数即为结果

class UnionFindSet(object):
    def __init__(self, nodes):
        '''
        初始化并查集
        '''
        # 记录每个节点的父节点
        self.fatherMap = {}
        # 各集合的数量
        self.setNumMap = {}
        # 初始化, 每个节点自成一派
        for node in nodes:
            self.fatherMap[node] = node
            self.setNumMap[node] = 1

    def findFather(self, node):
        '''
        递归逻辑:返回当前节点的父节点; 
        '''
        father = self.fatherMap[node]
        if (node != father):
            father = self.findFather(father)
        # 路径压缩
        self.fatherMap[node] = father
        return father

    def isSameSet(self, a, b):
        '''
        判断两个节点a和b是否属于同一集合
        '''
        return self.findFather(a) == self.findFather(b)

    def union(self, a, b):
        '''
        合并集合a到集合b中
        '''
        if a is None or b is None:
            return
        aFather=self.findFather(a)
        bFather = self.findFather(b)
        if (aFather != bFather):
            # 获取a,b集合的数量
            aNum=self.setNumMap[aFather]
            bNum=self.setNumMap[bFather]
            # a集合加入b的集合中
            self.fatherMap[aFather]=bFather
            self.setNumMap[bFather]=aNum + bNum
            # 删除aFather对应的人数纪录
            self.setNumMap.pop(aFather)

684:冗余连接

  • 以点为集合做并查集,初始集合根结点为点自身

  • 每条边代表一个并查集union操作(father[p1]=p0,这里记得p0和p1是两个结点的根结点)

  • 当一条边的两个结点早已在同一个集合时,即为冗余

👨‍🏭
📔
题解示意图