Skip to content

Commit 6f9e32f

Browse files
authored
Improved task 1020
1 parent 52d5509 commit 6f9e32f

File tree

1 file changed

+33
-26
lines changed
  • src/main/kotlin/g1001_1100/s1020_number_of_enclaves

1 file changed

+33
-26
lines changed

src/main/kotlin/g1001_1100/s1020_number_of_enclaves/Solution.kt

+33-26
Original file line numberDiff line numberDiff line change
@@ -2,39 +2,46 @@ package g1001_1100.s1020_number_of_enclaves
22

33
// #Medium #Array #Depth_First_Search #Breadth_First_Search #Matrix #Union_Find
44
// #Graph_Theory_I_Day_3_Matrix_Related_Problems
5-
// #2023_05_21_Time_369_ms_(76.26%)_Space_90.3_MB_(16.91%)
5+
// #2024_05_02_Time_283_ms_(90.70%)_Space_57.5_MB_(65.12%)
66

77
class Solution {
8-
fun numEnclaves(grid: Array<IntArray>): Int {
9-
val visited = Array(grid.size) {
10-
BooleanArray(
11-
grid[0].size
12-
)
8+
private fun walk(a: Array<IntArray>, visited: Array<BooleanArray>, x: Int, y: Int) {
9+
if (x >= a.size || x < 0 || y >= a[0].size || y < 0) {
10+
return
1311
}
14-
for (i in grid.indices) {
15-
for (j in grid[0].indices) {
16-
if (grid[i][j] == 1 && (i == 0 || j == 0 || i == grid.size - 1 || j == grid[0].size - 1)) {
17-
move(grid, i, j, visited)
18-
}
19-
}
12+
if (visited[x][y]) {
13+
return
2014
}
21-
var count = 0
22-
for (i in 1 until visited.size - 1) {
23-
for (j in 1 until visited[0].size - 1) {
24-
if (!visited[i][j] && grid[i][j] == 1) count++
25-
}
15+
if (a[x][y] == 0) {
16+
return
2617
}
27-
return count
18+
visited[x][y] = true
19+
walk(a, visited, x - 1, y)
20+
walk(a, visited, x, y - 1)
21+
walk(a, visited, x, y + 1)
22+
walk(a, visited, x + 1, y)
2823
}
2924

30-
companion object {
31-
fun move(g: Array<IntArray>, i: Int, j: Int, b: Array<BooleanArray>) {
32-
if (i < 0 || j < 0 || i == g.size || j == g[0].size || g[i][j] == 0 || b[i][j]) return
33-
b[i][j] = true
34-
move(g, i + 1, j, b)
35-
move(g, i - 1, j, b)
36-
move(g, i, j - 1, b)
37-
move(g, i, j + 1, b)
25+
fun numEnclaves(a: Array<IntArray>): Int {
26+
val n = a.size
27+
val m = a[0].size
28+
val visited = Array(n) { BooleanArray(m) }
29+
for (i in 0 until n) {
30+
walk(a, visited, i, 0)
31+
walk(a, visited, i, m - 1)
32+
}
33+
for (j in 0 until m) {
34+
walk(a, visited, 0, j)
35+
walk(a, visited, n - 1, j)
36+
}
37+
var unreachables = 0
38+
for (i in 0 until n) {
39+
for (j in 0 until m) {
40+
if (a[i][j] == 1 && !visited[i][j]) {
41+
++unreachables
42+
}
43+
}
3844
}
45+
return unreachables
3946
}
4047
}

0 commit comments

Comments
 (0)