Skip to content

Commit ee9c12c

Browse files
committed
Add 47_Number_of_Provinces.java
1 parent e57d4de commit ee9c12c

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed

Graphs/47_Number_of_Provinces.java

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
class Solution {
2+
public int findCircleNum(int[][] isConnected) {
3+
if (isConnected == null || isConnected.length == 0) {
4+
return 0;
5+
}
6+
7+
UnionFind uf = new UnionFind(isConnected.length);
8+
9+
for (int i = 0; i < isConnected.length; i++) {
10+
for (int j = 0; j < isConnected[i].length; j++) {
11+
if (isConnected[i][j] == 1) {
12+
uf.union(i, j);
13+
}
14+
}
15+
}
16+
17+
return uf.count();
18+
}
19+
20+
private class UnionFind {
21+
private int[] parents, size;
22+
private int count;
23+
24+
public UnionFind(int n) {
25+
parents = new int[n];
26+
size = new int[n];
27+
count = n;
28+
29+
for (int i = 0; i < parents.length; i++) {
30+
parents[i] = i;
31+
size[i] = 1;
32+
}
33+
}
34+
35+
public int find(int node) {
36+
if (parents[node] == node) {
37+
return node;
38+
}
39+
40+
parents[node] = find(parents[parents[node]]);
41+
return parents[node];
42+
}
43+
44+
public void union(int x, int y) {
45+
int xParent = find(x);
46+
int yParent = find(y);
47+
48+
if (xParent == yParent) {
49+
return;
50+
}
51+
52+
if (size[xParent] > size[yParent]) {
53+
parents[yParent] = xParent;
54+
size[xParent] += size[yParent];
55+
} else {
56+
parents[xParent] = yParent;
57+
size[yParent] += size[xParent];
58+
}
59+
60+
--count;
61+
}
62+
63+
public int count() {
64+
return count;
65+
}
66+
}
67+
}

0 commit comments

Comments
 (0)