思路:使用并查集,遍历isConnected数组,将相连的城市对应的集合合并,最后找不重复元素的个数就是省份的数量
class Solution {
static class UnionSet{
int[] parent;
public UnionSet(int length) {
parent = new int[length];
for(int i = 0; i < length; i++) {
parent[i] = i;
}
}
// i的根节点
int find(int i) {
int root = i;
while(parent[root] != root)
root = parent[root];
while(parent[i]!=root) {
int father = parent[i];
parent[i] = root;
i = father;
}
return root;
}
void merge(int i,int j) {
int root1 = find(i);
int root2 = find(j);
if(root1!=root2) {
parent[root2] = root1;
}
}
}
public int findCircleNum(int[][] isConnected) {
UnionSet unionSet = new UnionSet(isConnected.length);
for(int i = 0; i < isConnected.length; i++) {
for(int j = 0; j < isConnected[i].length;j++) {
if(isConnected[i][j] == 0) {
continue;
}
unionSet.merge(i, j);
}
}
Set<Integer> set= new HashSet<Integer>() ;
/*
*由于并查集的合并只改变了根节点的值,该集合中的其他元素与根节点值不同,
*在使用Set去重时结果会有偏差,所以重新调用了一次find函数,emm没想出什么好的解决办法
*/
for(int i = 0; i < unionSet.parent.length;i++) {
unionSet.find(i);
}
for(int i : unionSet.parent) {
set.add(i);
}
return set.size();
}
}