Leetcode之并查集专题-684. 冗余连接(Redundant Connection)
Leetcode之并查集专题-684. 冗余连接(Redundant Connection)
在本问题中, 树指的是一个连通且无环的无向图。
输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, ..., N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。
结果图是一个以边组成的二维数组。每一个边的元素是一对[u, v] ,满足 u < v,表示连接顶点u 和v的无向图的边。
返回一条可以删去的边,使得结果图是一个有着N个节点的树。如果有多个答案,则返回二维数组中最后出现的边。答案边 [u, v] 应满足相同的格式 u < v。
示例 1:
输入: [[1,2], [1,3], [2,3]]
输出: [2,3]
解释: 给定的无向图为:
1
/ \
2 - 3
示例 2:
输入: [[1,2], [2,3], [3,4], [1,4], [1,5]]
输出: [1,4]
解释: 给定的无向图为:
5 - 1 - 2
| |
4 - 3
注意:
- 输入的二维数组大小在 3 到 1000。
- 二维数组中的整数在1到N之间,其中N是输入数组的大小。
并查集问题中的最基本的问题,本题中为了不让这个树成环,需要找出最后一条让它成环的路径。
本题是并查集问题的第一题,介绍一下并查集和它的方法。
定义
并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。
举个简单的例子来讲:
现在有几个大家族,每个家族有很多个分支,有N个人,分别为1-N,每个人都有自己的祖先。
现在我想知道 A 和 B是否是一个祖先?
1、首先,每个人都有自己的祖先,所以我们用一个数组来存储A的祖先father[A]
2、每个人一开始,自己是自己的祖先。
3、根据输入的数据,对其祖先进行更新或修改。
4、如果需要判断A和B的祖先是否相同,比较father[A]和father[B]的值就可以了。
本题中,我们也可以把这个树的问题,当作是祖先问题。
以示例1为例:
一开始,每个人的祖先是自己,即
father[1] = 1; father[2] = 2; father[3] = 3;
第一个数据[1,2]输入:
father[2] = 1;
第二个数据[1,3]输入:
father[3] = 1;
第三个数据[2,3]输入,我们发现2和3的祖先已经不是自己了,即已经指派过祖先给它们了。
所以我们分别求一下2和3的祖先。
father[2] = 1;
father[3] = 1;
发现2和3属于同一个祖先,所以2-3之间这条线不能连接,不然就成环了。
那么,如果2和3的祖先不想等的话呢?
举个例子,2的祖先是4,3的祖先是5,那么我们可以让4的祖先等于5来把它们加入到同一个家族里。
这题还可以路径压缩优化一下:
class Solution {
int[] family ;
public int[] findRedundantConnection(int[][] edges) {
family = new int[edges.length+1];
for (int i = 0; i < edges.length+1; i++) {
family[i] = i;
}
for (int i = 0; i < edges.length; i++) {
int[] temp = edges[i];
int first = temp[0];
int second = temp[1];
int father1 = getFather(first);
int father2 = getFather(second);
if(father1==father2){
return temp;
}else{
family[father1] = father2;
}
}
return new int[2];
}
public int getFather(int i){
int father = family[i];
if(father==i){
return father;
}else{
return getFather(father);
}
}
}
Leetcode之并查集专题-684. 冗余连接(Redundant Connection)的更多相关文章
- Leetcode之并查集专题-765. 情侣牵手(Couples Holding Hands)
Leetcode之并查集专题-765. 情侣牵手(Couples Holding Hands) N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手. 计算最少交换座位的次数,以便每对情侣可以并 ...
- [Swift]LeetCode684. 冗余连接 | Redundant Connection
In this problem, a tree is an undirected graph that is connected and has no cycles. The given input ...
- Java实现 LeetCode 684 冗余连接(并查集)
684. 冗余连接 在本问题中, 树指的是一个连通且无环的无向图. 输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, -, N) 的树及一条附加的边构成.附加的边的两个顶点包含在1到N中间 ...
- LeetCode:并查集
并查集 这部分主要是学习了 labuladong 公众号中对于并查集的讲解,文章链接如下: Union-Find 并查集算法详解 Union-Find 算法怎么应用? 概述 并查集用于解决图论中「动态 ...
- ZR并查集专题
ZR并查集专题 并查集,作为一个基础算法,对于初学者来说,下面的代码是维护连通性的利器 return fa[x] == x ? x : fa[x] = getf(fa[x]); 所以,但是这对并查集的 ...
- 【LeetCode】并查集 union-find(共16题)
链接:https://leetcode.com/tag/union-find/ [128]Longest Consecutive Sequence (2018年11月22日,开始解决hard题) 给 ...
- Leetcode 684.冗余连接
冗余连接 在本问题中, 树指的是一个连通且无环的无向图. 输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, ..., N) 的树及一条附加的边构成.附加的边的两个顶点包含在1到N中间,这条 ...
- 【并查集专题】【HDU】
PS:做到第四题才发现 2,3题的路径压缩等于没写 How Many Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65 ...
- 并查集专题: HDU1232畅通工程
畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
随机推荐
- 2019HDU多校Path——最短路最小割
题目 给出一个 $n$ 个顶点 $m$ 条边的图,要求阻塞一些边,使得从 $1$ 到 $n$ 的最短路变长,求阻塞的边长度和的最小值,不必保证阻塞后可达. 分析 很显然,要阻塞的边肯定在最短路图上,先 ...
- Python操作MySQL数据库,插入重复数据
sql = "INSERT INTO test_c(id,name,sex)values(%s,%s,%s)" param = (1,'AJ','MAN') n = cursor ...
- JS BOM基础 全局对象 window location history screen navigator
全局变量声明的两种方式:1,window.变量名=值;2,var 变量名=值; 全局函数声明的两种方式:1,window.函数名=function(){}2,function 函数名=function ...
- vue使用Echarts图表
vue使用Echarts图表 童话_xxv 关注 0.5 2018.12.11 09:09* 字数 325 阅读 1456评论 2喜欢 13 在开发后台系统时,使用图表进行数据可视化,这样会使数据更 ...
- python 迭代工具
names = ['anne', 'beth', 'george', 'damon'] ages = [, , , ] for name,age in zip(names,ages): #print( ...
- learning express step(四)
learning express route function const express = require('express'); const app = express(); app.get(' ...
- Linux:sed
[参考文章]:shell中sed命令的用法 [参考文章]:SED 简明教程 1. 简述 sed是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用. 执行命令时,一次处理一行内容 ...
- BOM相关方法及属性
browser objec tmodel浏览器对象模型 BOM里面的方法大多在window对象底下,window代表窗口,也就是说,在BOM里面大多调用window下面的东西. 1.open方法是wi ...
- linux下的usb抓包方法
1 linux下的usb抓包方法1.配置内核使能usb monitor: make menuconfig Device Drivers --> ...
- poj1734
Sightseeing trip Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9078 Accepted: 3380 ...