@@ -2,39 +2,46 @@ package g1001_1100.s1020_number_of_enclaves
2
2
3
3
// #Medium #Array #Depth_First_Search #Breadth_First_Search #Matrix #Union_Find
4
4
// #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 %)
6
6
7
7
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
13
11
}
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
20
14
}
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
26
17
}
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)
28
23
}
29
24
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
+ }
38
44
}
45
+ return unreachables
39
46
}
40
47
}
0 commit comments