diff --git a/src/main/kotlin/g1001_1100/s1020_number_of_enclaves/Solution.kt b/src/main/kotlin/g1001_1100/s1020_number_of_enclaves/Solution.kt index 20a7b8d42..63afc7eb2 100644 --- a/src/main/kotlin/g1001_1100/s1020_number_of_enclaves/Solution.kt +++ b/src/main/kotlin/g1001_1100/s1020_number_of_enclaves/Solution.kt @@ -2,39 +2,46 @@ package g1001_1100.s1020_number_of_enclaves // #Medium #Array #Depth_First_Search #Breadth_First_Search #Matrix #Union_Find // #Graph_Theory_I_Day_3_Matrix_Related_Problems -// #2023_05_21_Time_369_ms_(76.26%)_Space_90.3_MB_(16.91%) +// #2024_05_02_Time_283_ms_(90.70%)_Space_57.5_MB_(65.12%) class Solution { - fun numEnclaves(grid: Array): Int { - val visited = Array(grid.size) { - BooleanArray( - grid[0].size - ) + private fun walk(a: Array, visited: Array, x: Int, y: Int) { + if (x >= a.size || x < 0 || y >= a[0].size || y < 0) { + return } - for (i in grid.indices) { - for (j in grid[0].indices) { - if (grid[i][j] == 1 && (i == 0 || j == 0 || i == grid.size - 1 || j == grid[0].size - 1)) { - move(grid, i, j, visited) - } - } + if (visited[x][y]) { + return } - var count = 0 - for (i in 1 until visited.size - 1) { - for (j in 1 until visited[0].size - 1) { - if (!visited[i][j] && grid[i][j] == 1) count++ - } + if (a[x][y] == 0) { + return } - return count + visited[x][y] = true + walk(a, visited, x - 1, y) + walk(a, visited, x, y - 1) + walk(a, visited, x, y + 1) + walk(a, visited, x + 1, y) } - companion object { - fun move(g: Array, i: Int, j: Int, b: Array) { - if (i < 0 || j < 0 || i == g.size || j == g[0].size || g[i][j] == 0 || b[i][j]) return - b[i][j] = true - move(g, i + 1, j, b) - move(g, i - 1, j, b) - move(g, i, j - 1, b) - move(g, i, j + 1, b) + fun numEnclaves(a: Array): Int { + val n = a.size + val m = a[0].size + val visited = Array(n) { BooleanArray(m) } + for (i in 0 until n) { + walk(a, visited, i, 0) + walk(a, visited, i, m - 1) + } + for (j in 0 until m) { + walk(a, visited, 0, j) + walk(a, visited, n - 1, j) + } + var unreachables = 0 + for (i in 0 until n) { + for (j in 0 until m) { + if (a[i][j] == 1 && !visited[i][j]) { + ++unreachables + } + } } + return unreachables } }