用并查集Union Find做
/**
* Runtime: 3 ms, faster than 29.76%
* Memory Usage: 39.5 MB, less than 53.75%
*/
class Solution {
public int[] findRedundantConnection(int[][] edges) {
HashMap<Integer, Integer> parents = new HashMap<>();
for (int[] edge : edges) {
if (!parents.containsKey(edge[0])) { // initiate parents
parents.put(edge[0], edge[0]);
}
if (!parents.containsKey(edge[1])) { // initiate parents
parents.put(edge[1], edge[1]);
}
if (find(edge[0], parents) == find(edge[1], parents)) {
return edge;
}
union(edge[0], edge[1], parents);
}
return null;
}
private int find(int vertic, HashMap<Integer, Integer> parents) {
int parent = parents.get(vertic);
if (vertic == parent) {
return vertic;
}
parents.put(vertic, find(parent, parents));
return parents.get(vertic);
}
private void union(int fVertic, int tVertic, HashMap<Integer, Integer> parents) {
parents.put(find(fVertic, parents), find(tVertic, parents));
}
}
/**
* 用数组比map查找和修改更快
* 另外因为本题是连通图,vertices的数量不会超过边的数量,数组长度设为edges.length+1,最节省空间
* Runtime: 0 ms, faster than 100.00%
* Memory Usage: 39.2 MB, less than 69.30%
*/
class Solution {
public int[] findRedundantConnection(int[][] edges) {
int maxVerticesNum = edges.length;
int[] parents = new int[maxVerticesNum + 1];
for (int i = 0; i <= maxVerticesNum; i++) {
parents[i] = i;
}
for (int[] edge : edges) {
if (find(edge[0], parents) == find(edge[1], parents)) {
return edge;
}
union(edge[0], edge[1], parents);
}
return null;
}
private int find(int vertic, int[] parents) {
if (vertic != parents[vertic]) {
parents[vertic] = find(parents[vertic], parents);
}
return parents[vertic];
}
private void union(int fVertic, int tVertic, int[] parents) {
int fParent = find(fVertic, parents), tParent = find(tVertic, parents);
parents[fParent] = tParent;
}
}