[leetcode] 并查集(Ⅱ)】的更多相关文章

预备知识 并查集 (Union Set) 一种常见的应用是计算一个图中连通分量的个数.比如: a e / \ | b c f | | d g 上图的连通分量的个数为 2 . 并查集的主要思想是在每个连通分量的集合中,选取一个代表,作为这个连通分量的根.根的选取是任意的,因为连通分量集合中每个元素都是等价的.我们只需关心根的个数(也是连通分量的个数).例如: a e / | \ / \ b c d f g 也就是说:root[b] = root[c] = root[d] = a 而 root[a]…
最长连续序列 题目[128]:链接. 解题思路 节点本身的值作为节点的标号,两节点相邻,即允许合并(x, y)的条件为x == y+1 . 因为数组中可能会出现值为 -1 的节点,因此不能把 root[x] == -1 作为根节点的特征,所以采取 root[x] == x 作为判断是否为根节点的条件.默认较小的节点作为连通分量的根. 此外,使用 map<int, int> counter 记录节点所在连通分量的节点个数(也是merge 的返回值). class Solution { publi…
婴儿名字 题目[Interview-1707]:典型并查集题目. 解题思路 首先对 names 这种傻 X 字符串结构进行预处理,转换为一个 map,key 是名字,val 是名字出现的次数. 然后是把 synonyms 转换为并查集结构,需要注意的是:总是把字典序较小的名字作为连通分量的根. 最后以连通分量的根作为代表,计算每个连通分量的总权重(即每个名字的次数之和). 代码实现 class Solution { public: unordered_map<string, string> r…
Leetcode之并查集专题-765. 情侣牵手(Couples Holding Hands) N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手. 计算最少交换座位的次数,以便每对情侣可以并肩坐在一起. 一次交换可选择任意两人,让他们站起来交换座位. 人和座位用 0 到 2N-1 的整数表示,情侣们按顺序编号,第一对是 (0, 1),第二对是 (2, 3),以此类推,最后一对是 (2N-2, 2N-1). 这些情侣的初始座位  row[i] 是由最初始坐在第 i 个座位上的人决定的.…
Leetcode之并查集专题-684. 冗余连接(Redundant Connection) 在本问题中, 树指的是一个连通且无环的无向图. 输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, ..., N) 的树及一条附加的边构成.附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边. 结果图是一个以边组成的二维数组.每一个边的元素是一对[u, v] ,满足 u < v,表示连接顶点u 和v的无向图的边. 返回一条可以删去的边,使得结果图是一个有着N个节点的树.如果有…
链接:https://leetcode.com/tag/union-find/ [128]Longest Consecutive Sequence  (2018年11月22日,开始解决hard题) 给了一个无序的数组,问这个数组里面的元素(可以重新排序)能组成的最长的连续子序列是多长.本题的时间复杂度要求是 O(N). 本题 array 专题里面有, 链接:https://www.cnblogs.com/zhangwanying/p/9610923.html ,用个 hashmap 可以做到 O…
题目描述: 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1: 输入: 11110 11010 11000 00000 输出: 1 示例 2: 输入: 11000 11000 00100 00011 输出: 3 思路分析:题解和示例图来自:liweiwei1419 说明:以下介绍的算法,除了并查集以外,DFS 和 BFS 都属于很基础的算法内容,也非常好理…
800. Similar RGB Color class Solution { int getn(int k){ return (k+8)/17; } string strd(int k){ char ret[3]; if(k<=9){ ret[1]=char(k+'0'); ret[0]=char(k+'0'); } else{ ret[0]=char(k-10+'a'); ret[1]=char(k-10+'a'); } ret[2]='\0'; return string(ret); }…
721. 账户合并 给定一个列表 accounts,每个元素 accounts[i] 是一个字符串列表,其中第一个元素 accounts[i][0] 是 名称 (name),其余元素是 emails 表示该帐户的邮箱地址. 现在,我们想合并这些帐户.如果两个帐户都有一些共同的邮件地址,则两个帐户必定属于同一个人.请注意,即使两个帐户具有相同的名称,它们也可能属于不同的人,因为人们可能具有相同的名称.一个人最初可以拥有任意数量的帐户,但其所有帐户都具有相同的名称. 合并帐户后,按以下格式返回帐户:…
并查集篇 # 题名 刷题 通过率 难度 128 最长连续序列   39.3% 困难 130 被围绕的区域   30.5% 中等 200 岛屿的个数   38.4% 中等 547 朋友圈   45.1% 中等 684 冗余连接   42.3% 中等 685 冗余连接 II   21.2% 困难 721 账户合并   18.5% 中等 765 情侣牵手   48.4% 困难 778 水位上升的泳池中游泳   37.3% 困难 803 打砖块   14.3% 困难…