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;
}
}
省份数量java实现
最新推荐文章于 2022-12-17 12:00:45 发布