并查集指所有有关联的数据存放在一个集合里面,同一集合里面的所有数据的根元素指向是同一元素,而根元素的父元素则是指向自己。并查集可以实现集合之间的合并,合并方法只需要让其中一个集合的根元素的父元素指向另外一个集合的根元素即可。用并查集解决朋友圈问题的具体代码如下:
class Unifound{
//定义一个并查集
public int count;
public int[] parent;
public Unifound(int n){
//传入的n其实表示的是数量
this.count=n;
parent=new int[n];
for (int i=0;i<count;i++){
parent[i]=i;
}
}
public int find(int p){
while (p!=parent[p]){
parent[p]=parent[parent[p]];
p=parent[p];
}
return p;
}
public void union(int p,int q){
int m=find(p);
int n=find(q);
if (m==n){
return;
}else {
parent[m]=n;
count--;
}
}
}
class Solution {
public int findCircleNum(int[][] isConnected) {
Unifound unifound=new Unifound(isConnected.length);
for (int i=0;i<isConnected.length;i++){
for (int j=0;j<i;j++){
if (isConnected[i][j]==1){
unifound.union(i,j);
}
}
}
return unifound.count;
}
}