547. 朋友圈(并查集)

547. 朋友圈

经过路径压缩的并查集,时间复杂度近似看成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;
    	}
    }

}

发布了56 篇原创文章 · 获赞 4 · 访问量 1661

猜你喜欢

转载自blog.csdn.net/qq_41342326/article/details/104435717