241024-547省份数量

16 阅读1分钟

思路

1)一组节点关系,求圈子数量不要求顺序——多叉树---归并
2)用quick-find解决

image.png

class Solution {
    public int findCircleNum(int[][] isConnected) {
        UnionFind unionFind = new UnionFind(isConnected.length);
        for (int i = 0; i < isConnected.length; i++) {
            for (int j = 0; j < isConnected.length; j++) {
                if (isConnected[i][j] == 1){
                    unionFind.union(i, j);
                }
            }
        }
        return unionFind.getCount();
    }

    class UnionFind{
        int count;//联通数
        int[] ids;//每个元素的标识
        int N;//节点个数
        public UnionFind(int n){
            ids = new int[n];
            N = n;
            count = N;
            //每个节点是一个标识为i的圈子
            for (int i = 0; i < ids.length; i++) {
                ids[i] = i;
            }
        }

        public int getCount(){
            return this.count;
        }

        public boolean union(int x, int y){
            int idx = ids[x];
            int idy = ids[y];
            if(idx == idy){
                return true;
            }
            for (int i = 0; i < N; i++) {
                if (ids[i] == idx){
                    //x的圈子都染成标识为y
                    ids[i] = idy;
                }
            }
            count--;
            return true;
        }
    }
}