Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 042c845

Browse files
solves #547: Number of Provinces in java
1 parent 1c9fad3 commit 042c845

File tree

4 files changed

+183
-54
lines changed

4 files changed

+183
-54
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,7 @@
345345
| 538 | [Convert BST to Greater Tree](https://leetcode.com/problems/convert-bst-to-greater-tree) | [![Java](assets/java.png)](src/ConvertBSTToGreaterTree.java) [![Python](assets/python.png)](python/convert_bst_to_greater_tree.py) | |
346346
| 541 | [Reverse String II](https://leetcode.com/problems/reverse-string-ii) | [![Java](assets/java.png)](src/ReverseStringII.java) [![Python](assets/python.png)](python/reverse_string_ii.py) | |
347347
| 543 | [Diameter of Binary Tree](https://leetcode.com/problems/diameter-of-binary-tree) | [![Java](assets/java.png)](src/DiameterOfBinaryTree.java) [![Python](assets/python.png)](python/diameter_of_binary_tree.py) | |
348+
| 547 | [Number of Provinces](https://leetcode.com/problems/number-of-provinces) | [![Java](assets/java.png)](src/NumberOfProvinces.java) | |
348349
| 551 | [Student Attendance Record I](https://leetcode.com/problems/student-attendance-record-i) | [![Java](assets/java.png)](src/StudentAttendanceRecordI.java) [![Python](assets/python.png)](python/student_attendance_record_I.py) | |
349350
| 557 | [Reverse Words in a String III](https://leetcode.com/problems/reverse-words-in-a-string-iii) | [![Java](assets/java.png)](src/ReverseWordsInStringIII.java) [![Python](assets/python.png)](python/reverse_words_in_string_iii.py) | |
350351
| 559 | [Maximum Depth of N-Ary Tree](https://leetcode.com/problems/maximum-depth-of-n-ary-tree) | [![Java](assets/java.png)](src/MaximumDepthOfNAryTree.java) [![Python](assets/python.png)](python/maximum_depth_of_n_ary_tree.py) | |

src/HelloWorld.java

Lines changed: 105 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,127 @@
1-
import java.util.*;
1+
import java.util.ArrayList;
2+
import java.util.Arrays;
3+
import java.util.HashMap;
4+
import java.util.HashSet;
5+
import java.util.LinkedList;
6+
import java.util.List;
7+
import java.util.Map;
8+
import java.util.Queue;
9+
import java.util.Set;
10+
11+
/*
12+
kahns algorithm
13+
t: O(V + E)
14+
S: O(E)
15+
*/
216

317
public class HelloWorld {
4-
public static class Node {
5-
public int val;
6-
public List<Node> neighbors;
7-
public Node() {
8-
val = 0;
9-
neighbors = new ArrayList<>();
18+
private static class QuickUnionFind {
19+
private final int[] array;
20+
21+
public QuickUnionFind(int size) {
22+
array = new int[size];
23+
for (int i = 0 ; i < array.length ; i++) {
24+
array[i] = i;
25+
}
1026
}
11-
public Node(int _val) {
12-
val = _val;
13-
neighbors = new ArrayList<>();
27+
28+
public void union(int x, int y) {
29+
final int rootX = find(x), rootY = find(y);
30+
if (rootY == rootX) {
31+
return;
32+
}
33+
34+
for (int i = 0 ; i < array.length ; i++) {
35+
if (array[i] == rootY) {
36+
array[i] = rootX;
37+
}
38+
}
1439
}
15-
public Node(int _val, ArrayList<Node> _neighbors) {
16-
val = _val;
17-
neighbors = _neighbors;
40+
41+
public int find(int num) {
42+
return array[num];
1843
}
1944

20-
@Override
21-
public String toString() {
22-
return "Node{" +
23-
"val=" + val +
24-
'}';
45+
public boolean areConnected(int x, int y) {
46+
return find(x) == find(y);
2547
}
2648
}
2749

28-
public static Node cloneGraph(Node root) {
29-
final Queue<Node> queue = new LinkedList<>();
30-
final Map<Node, Node> oldToNew = new HashMap<>();
31-
final Set<Node> processed = new HashSet<>();
32-
queue.add(root);
50+
private static final class QuickUnionDisjointSet {
51+
private final int[] array;
3352

34-
while (!queue.isEmpty()) {
35-
final Node node = queue.poll();
36-
if (processed.contains(node)) {
37-
continue;
53+
public QuickUnionDisjointSet(int size) {
54+
array = new int[size];
55+
for (int i = 0 ; i < array.length ; i++) {
56+
array[i] = i;
3857
}
39-
processed.add(node);
40-
41-
final Node newNode = oldToNew.getOrDefault(node, new Node(node.val));
42-
oldToNew.putIfAbsent(node, newNode);
58+
}
4359

44-
for (Node edge : node.neighbors) {
45-
final Node newEdge = oldToNew.getOrDefault(edge, new Node(edge.val));
46-
oldToNew.putIfAbsent(edge, newEdge);
47-
newNode.neighbors.add(newEdge);
48-
queue.add(edge);
60+
public int find(int num) {
61+
while (array[num] != num) {
62+
num = array[num];
4963
}
64+
return num;
5065
}
5166

52-
return oldToNew.get(root);
53-
}
67+
public boolean areConnected(int x, int y) {
68+
return find(x) == find(y);
69+
}
5470

55-
public static void main(String[] args) {
56-
final Node node1 = new Node(1);
57-
final Node node2 = new Node(2);
58-
final Node node3 = new Node(3);
59-
final Node node4 = new Node(4);
71+
public void union(int x, int y) {
72+
final int rootX = find(x), rootY = find(y);
73+
if (rootX == rootY) {
74+
return;
75+
}
76+
array[rootY] = rootX;
77+
}
78+
}
6079

61-
node1.neighbors.add(node2);
62-
node1.neighbors.add(node4);
80+
private static final class DisjointSetRank {
81+
private final int[] array;
82+
private final int[] rank;
6383

64-
node2.neighbors.add(node1);
65-
node2.neighbors.add(node3);
84+
public DisjointSetRank(int size) {
85+
array = new int[size];
86+
rank = new int[size];
87+
for (int i = 0 ; i < array.length ; i++) {
88+
rank[i] = 1;
89+
array[i] = i;
90+
}
91+
}
6692

67-
node3.neighbors.add(node2);
68-
node3.neighbors.add(node4);
93+
// T: O(logN)
94+
// S: O(1)
95+
public int find(int num) {
96+
if (num == array[num]) {
97+
return num;
98+
}
99+
final int root = find(array[num]);
100+
array[num] = root;
101+
return root;
102+
}
69103

70-
node4.neighbors.add(node1);
71-
node4.neighbors.add(node3);
104+
// T: O(logN)
105+
// S: O(1)
106+
public void union(int x, int y) {
107+
final int rootX = find(x), rootY = find(y);
108+
if (rootX == rootY) {
109+
return;
110+
}
111+
if (rank[rootX] > rank[rootY]) {
112+
array[rootY] = rootX;
113+
} else if (rank[rootX] < rank[rootY]) {
114+
array[rootX] = rootY;
115+
} else {
116+
array[rootY] = rootX;
117+
rank[rootX]++;
118+
}
119+
}
72120

73-
final Node clone = cloneGraph(node1);
74-
System.out.println(clone);
121+
// T: O(logN)
122+
// S: O(1)
123+
public boolean areConnected(int x, int y) {
124+
return find(x) == find(y);
125+
}
75126
}
76-
}
127+
}

src/NumberOfProvinces.java

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// https://leetcode.com/problems/number-of-provinces
2+
// T: O(N^2)
3+
// S: O(N)
4+
5+
public class NumberOfProvinces {
6+
private static final class DisjointSet {
7+
private final int[] array, rank;
8+
9+
public DisjointSet(int size) {
10+
this.array = new int[size];
11+
this.rank = new int[size];
12+
for (int i = 0 ; i < size ; i++) {
13+
array[i] = i;
14+
rank[i] = 1;
15+
}
16+
}
17+
18+
// T: O(1)
19+
public int find(int x) {
20+
if (x == array[x]) {
21+
return x;
22+
}
23+
final int rank = find(array[x]);
24+
array[x] = rank;
25+
return rank;
26+
}
27+
28+
// T: O(1)
29+
public boolean areConnected(int x, int y) {
30+
return find(x) == find(y);
31+
}
32+
33+
// T: O(1)
34+
public void union(int x, int y) {
35+
final int rootX = find(x), rootY = find(y);
36+
if (rootX == rootY) {
37+
return;
38+
}
39+
if (array[rootX] > array[rootY]) {
40+
array[rootY] = rootX;
41+
} else if (array[rootX] < array[rootY]) {
42+
array[rootX] = rootY;
43+
} else {
44+
array[rootY] = rootX;
45+
rank[rootX]++;
46+
}
47+
}
48+
49+
private int size() {
50+
return array.length;
51+
}
52+
}
53+
54+
// T: O(n^2)
55+
public int findCircleNum(int[][] isConnected) {
56+
final int cities = isConnected.length;
57+
final DisjointSet disjointSet = new DisjointSet(cities);
58+
int provinces = cities;
59+
60+
for (int i = 0 ; i < cities ; i++) {
61+
for (int j = i + 1 ; j < cities ; j++) {
62+
if (isConnected[i][j] == 1 && disjointSet.find(i) != disjointSet.find(j)) {
63+
disjointSet.union(i, j);
64+
provinces--;
65+
}
66+
}
67+
}
68+
69+
return provinces;
70+
}
71+
}

src/SnakesAndLadders.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// https://leetcode.com/problems/snakes-and-ladders
2+
// T: O()
3+
// S: O()
4+
5+
public class SnakesAndLadders {
6+
}

0 commit comments

Comments
 (0)