经过路径压缩的并查集,时间复杂度近似看成O(1)
时间复杂度:O(n2)
空间复杂度:O(n)
class Solution {
public int findCircleNum(int[][] M) {
Disjoint_Set ds = new Disjoint_Set(M.length);
for (int i = 0; i < M.length; i++) {
for (int j = i; j < M[0].length; j++) {
if(M[i][j] == 1 && i != j)
ds.union(i, j);
}
}
int res = 0;
for (int i = 0; i < ds.parents.length; i++) {
if(ds.parents[i] == i) //遍历查看有几个并查集
res++;
}
return res;
}
//基于路径压缩的并查集
class Disjoint_Set {
int[] parents;
public Disjoint_Set(int n) {
parents = new int[n];
for (int i = 0; i < n; i++) {
parents[i] = i;
}
}
//返回x的根节点
public int find(int x) {
if(parents[x] != x) {
parents[x] = find(parents[x]);//将途中节点连接到根节点上
}
return parents[x];
}
public boolean isSame(int x, int y) {
return find(x) == find(y);
}
public void union(int x, int y) {
int p1 = find(x);
int p2 = find(y);
if(p1 == p2) //所属同一集合,直接返回
return ;
parents[p1] = p2;
return;
}
}
}