2021/01 LeetCode 并查集总结

整个1月LeetCode很多题都是用并查集来解决的,这里记录下自己理解的并查集思路,方便以后查阅

本月做过属于并查集的题有:

2021/01/31 每日一题 相似字符串组
2021/01/30 每日一题 水位上升的泳池中游泳
2021/01/29 每日一题 最小体力消耗路径
2021/01/25 每日一题 由斜杠划分区域
2021/01/23 每日一题 连通网络的操作次数
2021/01/13 每日一题 冗余连接
2021/01/15 每日一题 移除最多的同行或同列石头
2021/01/11 每日一题 交换字符串中的元素
2021/01/07 每日一题 省份数量

以上基本上都是中等或困难难度的题,可以点击对应文章链接去看解题思路。

其实刚开始觉得为什么都是并查集感觉好烦,但是静下心来,这个月做了快10道并查集的题目,到今天31号的时候,看到并查集还是做起来挺轻松的了,LeetCode一个月并查集做下来还是挺有收获的。

所以并查集到底是什么?

并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。
合并(Union):把两个不相交的集合合并为一个集合。
查询(Find):查询两个元素是否在同一个集合中。

基本上如果有多个节点要连接,查询他们是否连通/是否为一个集合的时候就能用到并查集,并查集的图解过程如下

创建节点

第一步就是创建多个节点,并且将节点自己的parent属性设定为自己,图中的箭头就代表着节点parent属性的指向

连接节点

之后通过传入的参数进行节点的链接,比如[1,5][1,2][5,3]


那么此时这个图自然分为了[1,2,3,5]/[4]/[6]/[7]/[8],5个区域,其中[1,2,3,5]连通,这里就是合并的过程
一般程序中会将节点的parent属性设为另外一个节点,[1,2]的连接比较好理解,直接把2节点的parent设为1节点即可,但是[1,5][5,3]是一个多点连接的线,是3>5>1的链接过程,当然可以5.parent = 1 3.parent = 5这样设置。

查询

对于并查集连接上了之后,要怎么样确定他们为同一个合集?

假设判断7和5是否为同一个合集:
7.parent属性是自己本身
5.parent属性是1,1.parent属性是本身
那么通过parent属性判断就能知道7/5不是一个合集

如果判断3/4是否连接
3.parent = 5 >5.parent = 1>1.parent = 1这样查询,最后返回的是1
4.parent = 4 返回的是4
1 !== 4 所以最后3/4没连接

通过上面的两个例子不难看出,在并查集里面最后来判断两个节点是否连通,都是通过parent属性不断向上查找,直到找到最底层的parent属性,一层层向上寻找,来对比这个属性内存的值,相等就是连通,对于短的连接也许时间还不长,但是面对大数据就比较麻烦了,所以就有了压缩路径的处理

压缩路径


单看上面[1,2,3,5],其实在连接[5,3]的时候只需要将5.parent的值直接给3.parent即可,就是把连接最顶端的节点给新连上的节点的parent属性,那么这里会用到递归来找到最顶端的节点

const find = function (x) {
   while(x !== x.parent) {
      x = x.parent
   }
   return x 
} 
// 伪代码使用
3.parent = find(5)

当一个节点的parent属性为自身的时候他就是顶端,根据这个原理,只要一直查找节点的parent属性,直到parent属性等于自身,那么就是找到了顶端节点了,之后赋值即可,那么上面的图就可以优化如下


优化后,如果要查找3/8是否连通
就不需要3.parent = 5 >5.parent = 1>1.parent = 1这样查找,直接是3.parent = 1 >1.parent = 1,1次就能到位,在大数据运算的时候就能省下时间。

基本上并查集就上面几个步骤

  1. 将所有节点合并成不同的区域,每个区域的节点的parent都指向1个parent属性等于自己的节点,这个节点就是当前区域的顶点
  2. 比较2点是否连通,就看他们区域的顶点是否连通,通过不断查找parent,直到找到parent属性等于本身的节点,比较两个节点,不相同就是不连通

参考文章

  1. 并查集详解 ——图文解说,简单易懂(转)
  2. 算法学习笔记(1) : 并查集
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容