Skip to content

Commit 05c55be

Browse files
authored
Improved task 924.
1 parent 9a9f739 commit 05c55be

File tree

1 file changed

+52
-45
lines changed
  • src/main/java/g0901_1000/s0924_minimize_malware_spread

1 file changed

+52
-45
lines changed
Lines changed: 52 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,75 @@
11
package g0901_1000.s0924_minimize_malware_spread;
22

33
// #Hard #Array #Depth_First_Search #Breadth_First_Search #Matrix #Union_Find
4-
// #2022_03_29_Time_127_ms_(5.44%)_Space_129.2_MB_(17.35%)
5-
6-
import java.util.HashMap;
7-
import java.util.HashSet;
4+
// #2022_04_29_Time_10_ms_(47.21%)_Space_55.1_MB_(83.27%)
85

96
public class Solution {
10-
private int[][] par;
7+
private int[] size;
8+
private int[] par;
119

1210
public int minMalwareSpread(int[][] graph, int[] initial) {
13-
int n = graph.length;
14-
par = new int[n][2];
15-
for (int i = 0; i < par.length; i++) {
16-
par[i][0] = i;
17-
par[i][1] = 1;
11+
size = new int[graph.length];
12+
par = new int[graph.length];
13+
for (int i = 0; i < graph.length; i++) {
14+
size[i] = 1;
15+
par[i] = i;
1816
}
19-
for (int i = 0; i < n; i++) {
20-
for (int j = i + 1; j < n; j++) {
17+
// create groups
18+
for (int i = 0; i < graph.length; i++) {
19+
for (int j = 0; j < graph[0].length; j++) {
2120
if (graph[i][j] == 1) {
22-
int li = find(i);
23-
int lj = find(j);
24-
if (li != lj) {
25-
par[li][0] = lj;
26-
par[lj][1] += par[li][1];
27-
}
21+
int p1 = find(i);
22+
int p2 = find(j);
23+
merge(p1, p2);
2824
}
2925
}
3026
}
31-
HashMap<Integer, HashSet<Integer>> map = new HashMap<>();
32-
for (int val : initial) {
33-
int lv = find(val);
34-
if (!map.containsKey(lv)) {
35-
map.put(lv, new HashSet<>());
36-
}
37-
map.get(lv).add(val);
27+
// no of infected in group
28+
int[] infected = new int[graph.length];
29+
for (int e : initial) {
30+
int p = find(e);
31+
infected[p]++;
3832
}
33+
int currSize = -1;
3934
int ans = -1;
40-
int max = Integer.MIN_VALUE;
41-
for (int val : initial) {
42-
int lv = find(val);
43-
if (map.get(lv).size() == 1) {
44-
if (par[lv][1] > max) {
45-
max = par[lv][1];
46-
ans = val;
47-
} else if (par[lv][1] == max && val < ans) {
48-
ans = val;
49-
}
50-
} else {
51-
if (max < 0) {
52-
max = 0;
53-
ans = val;
54-
} else if (max == 0 && val < ans) {
55-
ans = val;
35+
for (int e : initial) {
36+
int p = find(e);
37+
if (infected[p] == 1 && size[p] >= currSize) {
38+
if (size[p] > currSize) {
39+
ans = e;
40+
} else {
41+
ans = Math.min(ans, e);
5642
}
43+
currSize = size[p];
44+
}
45+
}
46+
// all groups have more than 1 infected node then return min value from initial
47+
if (ans == -1) {
48+
ans = initial[0];
49+
for (int i = 0; i < initial.length; i++) {
50+
ans = Math.min(ans, initial[i]);
5751
}
5852
}
5953
return ans;
6054
}
6155

62-
private int find(int x) {
63-
if (par[x][0] == x) {
64-
return x;
56+
private void merge(int p1, int p2) {
57+
if (p1 != p2) {
58+
if (size[p1] > size[p2]) {
59+
par[p2] = p1;
60+
size[p1] += size[p2];
61+
} else {
62+
par[p1] = p2;
63+
size[p2] += size[p1];
64+
}
65+
}
66+
}
67+
68+
private int find(int u) {
69+
if (par[u] == u) {
70+
return u;
6571
}
66-
return find(par[x][0]);
72+
par[u] = find(par[u]);
73+
return par[u];
6774
}
6875
}

0 commit comments

Comments
 (0)