省份数量java实现

class Solution {
    public int findCircleNum(int[][] isConnected) {
        //首先我们这一题采用并查集的知识进行解题,并查集是图中不相交集合,它与图中的一个个子图相对应,通常用来求解一个图中有多少个子图或者一个图中的子图最大有多少个元素等等问题
        //要运用图的只是解题的前提是确定图中的节点和边,我们将每一个城市当作是一个节点,把城市和城市之间的直接相连的关系当作是一条边
        //并查集的定义就是定义一个数组用于表示节点的根节点是否一致,如果根节点相同就说明它们在同一个并查集中也就是是说明它们在同一张子图中
        int length = isConnected.length;
        //首先创建一个和节点数量相同的一维数组用于表示并查集(也就是每一个节点的根节点是哪一个)
        int[] fathers = new int[length];
        //初始时把它们看作是n个独立的子图根节点都指向自己
        for(int i = 0;i < length;i++){
            fathers[i] = i;
        } 
        //接着逐个遍历isConnected中的每一条为1的关系,判断它们现在是否在一个子集当中,如果在则说明不需要减少总集合的数目,如果不在就要将它们添加到一个集合当中并且减少总集合的数目
        int count = length;
        for(int i = 0;i < length;i++){
            for(int j = i + 1;j < length;j++){
                if(isConnected[i][j] == 1 && union(i,j,fathers)){
                    count--;
                }
            }
        }
        return count;
    }

    private int findRoot(int node,int[] fathers){
        if(fathers[node] != node){
            fathers[node] = findRoot(fathers[node],fathers);
        } 
        return fathers[node];
    }

    //判断两个集合需不需要联合
    private boolean union(int i,int j,int fathers[]){
        //首先求出i,j的根节点
        int rooti = findRoot(i,fathers);
        int rootj = findRoot(j,fathers);
        //查看根节点是否相同相同则不需要结合返回false
        if(rooti != rootj){
            fathers[rooti] = rootj;
            return true;
        }
        //如果根节点不相同则说明需要将它们添加到一个集合当中取返回true
        return false;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值