0%

leetCode-684:Redundant Connection

问题描述

给定一个二维数组表示边的集合,每条边表示从某个低数字的节点到高数字的节点的连线,这些边连接后构成一个无向连通图,其中存在一条边,使得这个无向连通图存在一个环,要求将这条边找出并剔除,使得剩下的图不存在环结构,同时仍然保持是一个无向的连通图。如果存在多条边,则返回最后出现的那条边。题目链接:**点我**

样例输入输出

输入:[[1,2], [1,3], [2,3]]

输出:[2,3]

输入:[[1,2], [2,3], [3,4], [1,4], [1,5]]

输出:[1,4]

问题解法

使用并查集算法,对输入的边的节点分别查找其根节点,如果相同,则说明这是一条多余的边,否则合并当前的边。代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Solution
{
public int[] findRedundantConnection(int[][] edges)
{
int[] parents = new int[edges.length + 1];
for (int i = 0; i < parents.length; i++)
{
parents[i] = i;
}

for (int[] edge : edges)
{
int uParent = findParent(parents, edge[0]);
int vParent = findParent(parents, edge[1]);
if (uParent != vParent)
{
parents[uParent] = vParent;
}
else
{
return new int[]{edge[0], edge[1]};
}
}

return new int[] {0, 0};
}

private int findParent(int[] parents, int i)
{
if (i == parents[i])
{
return i;
}

int root = findParent(parents, parents[i]);
parents[i] = root;
return root;
}
}