@@ -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
77class 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