forked from fishercoder1534/Leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path_305.java
76 lines (71 loc) · 2.32 KB
/
_305.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package com.fishercoder.solutions;
import java.util.ArrayList;
import java.util.List;
public class _305 {
public static class Solution1 {
public int find(int[] father, int id) {
int tf = father[id];
while (tf != father[tf]) {
tf = father[tf];
}
int cur = id;
int tmp;
while (father[cur] != tf) {
tmp = father[cur];
father[cur] = tf;
cur = tmp;
}
return tf;
}
public void union(int[] father, int[] sz, int id1, int id2) {
int tf1 = find(father, id1);
int tf2 = find(father, id2);
if (tf1 != tf2) {
if (sz[tf1] > sz[tf2]) {
father[tf2] = tf1;
sz[tf1] += sz[tf2];
} else {
father[tf1] = tf2;
sz[tf2] += sz[tf1];
}
}
}
public List<Integer> numIslands2(int m, int n, int[][] positions) {
if (m == 0 || n == 0) {
return new ArrayList<>();
}
ArrayList<Integer> res = new ArrayList();
int[] father = new int[m * n];
for (int i = 0; i < father.length; i++) {
father[i] = -1;
}
int[] sz = new int[m * n];
int[] dr = {0, 0, -1, 1};
int[] dc = {-1, 1, 0, 0};
int r;
int c;
int nr;
int nc;
int count = 0;
for (int i = 0; i < positions.length; i++) {
r = positions[i][0];
c = positions[i][1];
count++;
father[r * n + c] = r * n + c;
sz[r * n + c] = 1;
for (int j = 0; j < 4; j++) {
nr = r + dr[j];
nc = c + dc[j];
if (nr >= 0 && nr < m && nc >= 0 && nc < n && father[nr * n + nc] != -1) {
if (find(father, r * n + c) != find(father, nr * n + nc)) {
count--;
union(father, sz, r * n + c, nr * n + nc);
}
}
}
res.add(count);
}
return res;
}
}
}