基本概念

  • 并查集是一种数据结构
  • 并查集这三个字,一个字代表一个意思。
  • 并(Union),代表合并
  • 查(Find),代表查找
  • 集(Set),代表这是一个以字典为基础的数据结构,它的基本功能是合并集合中的元素,查找集合中的元素
  • 并查集的典型应用是有关连通分量的问题
  • 并查集解决单个问题(添加,合并,查找)的时间复杂度都是O(1)O(1)

并查集的实现

数据结构

并查集跟树有些类似,只不过她跟树是相反的。在树这个数据结构里面,每个节点会记录它的子节点。在并查集里,每个节点会记录它的父节点。

class UnionFind:def __init__(self):"""记录每个节点的父节点"""self.father = {}

初始化

当把一个新节点添加到并查集中,它的父节点应该为空

    def add(self,x):"""添加新节点"""if x not in self.father:self.father[x] = None

合并两个节点

如果发现两个节点是连通的,那么就要把他们合并,也就是他们的祖先是相同的。这里究竟把谁当做父节点一般是没有区别的。

    def merge(self,x,y,val):"""合并两个节点"""root_x,root_y = self.find(x),self.find(y)if root_x != root_y:self.father[root_x] = root_y

两节点是否连通

    def is_connected(self,x,y):"""判断两节点是否相连"""return self.find(x) == self.find(y)

查找祖先

def find(self,x):"""查找根节点"""root = xwhile self.father[root] != None:root = self.father[root]return root

这里有一个优化的点:如果我们树很深,比如说退化成链表,那么每次查询的效率都会非常低。所以我们要做一下路径压缩。也就是把树的深度固定为二。

这么做可行的原因是,并查集只是记录了节点之间的连通关系,而节点相互连通只需要有一个相同的祖先就可以了。

路径压缩

    def find(self,x):"""查找根节点路径压缩"""root = xwhile self.father[root] != None:root = self.father[root]# 路径压缩while x != root:original_father = self.father[x]self.father[x] = rootx = original_fatherreturn root

牛刀小试

直通车

class Solution:def findCircleNum(self, isConnected: List[List[int]]) -> int: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)provinces = len(isConnected)parent = list(range(provinces))for i in range(provinces):for j in range(i + 1, provinces):if isConnected[i][j] == 1:union(i, j)circles = sum(parent[i] == i for i in range(provinces))return circles

以上笔记参考:

Leetcode——唯唯诺诺对并查集的初次相见相关推荐

  1. C#LeetCode刷题-并查集

    并查集篇 # 题名 刷题 通过率 难度 128 最长连续序列 39.3% 困难 130 被围绕的区域 30.5% 中等 200 岛屿的个数 38.4% 中等 547 朋友圈 45.1% 中等 684 ...

  2. LeetCode Evaluate Division(并查集)

    问题:给出一些形式为a/b=c的等式,要求一系列x/y的值 思路: 当a/b=c时,用p[a]=b,w[a]=c,表示a父结点为b,并且从a到b的权值为c.假设a的根结点为c,a到c的权值为w1,d的 ...

  3. [L氏并查集] Python 列表法实现非递归并查集,轻松权重优化。

    一般的并查集都是用递归或者新建一个类来实现,这里介绍一种用Python来实现的非递归非函数并查集,这个方法暂时未在其他地方见过,尤其是中文领域目前还未见过,很可能是搜索引擎无法搜索到正确内容的原因,所 ...

  4. POJ - 1417 True Liars POJ - 141 带权并查集,01背包问题

    题目链接 POJ-1417 题意 岛上有说真话的好人和说假话的坏人,给你这两种人的人数.再给出q次问答结果,问答的格式是向a询问b是否是好人,回答是yes或者no.问是否可以分辨出全部好人,是的话打印 ...

  5. 并查集c++代码_[Leetcode 每日精选](本周主题-并查集) 547. 朋友圈

    题目难度: 中等 原题链接 今天继续来做并查集的问题, 这道题仍然比较基础, 而且也是个比较接近现实的问题了. 大家在我的公众号"每日精选算法题"中的聊天框中回复 并查集 就能看到 ...

  6. leetcode 721. Accounts Merge | 721. 账户合并(HashMap版并查集)

    题目 https://leetcode.com/problems/accounts-merge/ 题解 HashMap 版的并查集.参考了:leetcode 684. Redundant Connec ...

  7. leetcode 684. Redundant Connection | 684. 冗余连接(并查集)

    题目 https://leetcode.com/problems/redundant-connection/ 题解 并查集问题 1)有若干个样本a.b.c.d-类型假设是V 2)在并查集中一开始认为每 ...

  8. LeetCode 2092. 找出知晓秘密的所有专家(并查集)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n ,表示有 n 个专家从 0 到 n - 1 编号. 另外给你一个下标从 0 开始的二维整数数组 meetings ,其中 meeting ...

  9. LeetCode 2076. 处理含限制条件的好友请求(并查集)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n ,表示网络上的用户数目.每个用户按从 0 到 n - 1 进行编号. 给你一个下标从 0 开始的二维整数数组 restrictions ...

最新文章

  1. 机器学习数据预处理之缺失值:插值法填充+多项式插值
  2. iis6.0怎么搭php,IIS6.0平台下PHP最佳配置方法
  3. Postgresql的HashJoin状态机流程图整理
  4. 【UIKit】UITableView.06
  5. 苹果发布iOS 15.3正式版 修复了Safari浏览器漏洞
  6. 模拟赛 10-14考试再次翻车记
  7. OpenShift 4 - 安装3Scale API Management环境
  8. MySQL 5.6 dump/load buffer pool实验
  9. MySQL-快速入门(9)视图
  10. 鼎博电梯门禁数据分析
  11. PHP仿给你花分期小额贷款平台源码
  12. 19-Spring Security资源服务器配置详解
  13. 【测试人生】安卓FPS测试详解
  14. 014:针对mdk中STM32程序无法使用printf,产生停留BEAB BKPT 0xAB处问题的解决(转)
  15. 移动网络广告优化(速度优化篇)
  16. 如何通过Spring的ApplicationListener事件注册服务
  17. 怎么把PDF转换成图片?这几种转换方法都可以做到
  18. 原型模式-广告邮件推送
  19. (费用流)洛谷P2469 [SDOI2010]星际竞速
  20. 人工智能有哪些好处???

热门文章

  1. android 通知栏背景颜色跟随app导航栏背景颜色变化而变化
  2. 鸿蒙出来后H5足以取代原生app
  3. ES5-ES6-ES7_字符串与JOSN格式的数据相互转换以及深度克隆新对象
  4. c语言 结构体ppt,C语言知识学习结构体.ppt
  5. 【电脑办公软件】万彩办公大师教程丨TextDiff文本比较工具
  6. 北美华人第一大折扣信息网站。北美省钱快报是北美最有人气的微博,北美省钱快报是新浪折扣频道独家合作伙伴...
  7. 华为RH2288做raid方法
  8. FT60F011A包含1Krom+EEPROM+Flash单片机IC方案开发
  9. C++——NOIP模拟题——葫芦
  10. Flutter问题记录 - Unable to find bundled Java version