684. 冗余连接
思路一:并查集(检查环)
我们顺次Union每条边,直到出现新加的边已经在同一类里面,因为我们每次循环都会保证UnionFind中的任意两个元素之间都有通路。
class Solution {
public int[] findRedundantConnection(int[][] edges) {
// 用并查集找环
int len = edges.length;
UnionFind uf = new UnionFind(len+1);
for(int i=0;i<len;i++){
if(uf.find(edges[i][0])!=uf.find(edges[i][1]))
uf.union(edges[i][0],edges[i][1]);
// 否则我们就找到一个环
else
return edges[i];
}
return new int[0];
}
}
class UnionFind{
int[] rank;
int[] element;
public UnionFind(int N){
this.rank = new int[N];
this.element = new int[N];
for(int i=0;i<N;i++)
this.element[i]=i;
}
public int find(int i){
if(element[i]==i)
return i;
else{
element[i] = find(element[i]);
return element[i];
}
}
public void union(int i, int j){
int parenti=find(i);
int parentj=find(j);
if(rank[i]<rank[j]){
element[parenti]=parentj;
}
else if(rank[i]>rank[j]){
element[parentj]=parenti;
}
else{
element[parentj]=parenti;
rank[parenti]++;
}
}
}