leetcode

Leetcode Solutions (0x6A73)
git clone https://git.pngu.org/leetcode
Log | Files | Refs | Submodules | README

commit b913661b53a8cb74715a2e87eafe17f7f9419d2c
parent c2bc609ab93ea55966b9b67fd736ab168a013690
Author: Jack Sangdahl <jack@pngu.org>
Date:   Sat, 14 Feb 2026 20:43:56 -0700

1020. number of enclaves

Diffstat:
Mnum_enclaves.c | 83++++++++++++++++++++++++++++++++++++-------------------------------------------
Anum_enclaves.py | 41+++++++++++++++++++++++++++++++++++++++++
2 files changed, 79 insertions(+), 45 deletions(-)

diff --git a/num_enclaves.c b/num_enclaves.c @@ -1,6 +1,5 @@ // 1020. Number of Enclaves -#include <stdbool.h> -#include <stdio.h> +#include "leetcode.h" /* * given an 'm * n' binary matrix grid, where 0 represents a sea @@ -11,55 +10,49 @@ * boundary of the grid in any number of moves. */ -int u_find(int *u, int val) { - if (u[val] == val) - return val; - return u_find(u, u[val]); -} - -bool u_set(int *u, int a, int b) { - int find_a = u_find(u, a), find_b = u_find(u, b); - if (find_a == find_b) - return false; - u[find_a] = u[find_b]; - return true; -} - -void bfs(int **grid, int row, int col, int i, int j) { - if (i < 0 || i >= row || j < 0 || j >= col) - return; - if (!grid[i][j]) +void dfs(int **grid, int r, int c, int n, int m) { + if (r < 0 || c < 0 || r > n - 1 || c > m - 1 || !grid[r][c] || + grid[r][c] == -1) return; - grid[i][j] = 0; - bfs(grid, row, col, i - 1, j); - bfs(grid, row, col, i + 1, j); - bfs(grid, row, col, i, j - 1); - bfs(grid, row, col, i, j + 1); + grid[r][c] = -1; + dfs(grid, r + 1, c, n, m); + dfs(grid, r - 1, c, n, m); + dfs(grid, r, c + 1, n, m); + dfs(grid, r, c - 1, n, m); } -int numEnclaves(int **grid, int grid_size, int *grid_col_size) { - int row = grid_size, col = *grid_col_size; - for (int i = 0; i < col; i++) - bfs(grid, row, col, 0, i); - for (int i = 0; i < col; i++) - bfs(grid, row, col, row - 1, i); - for (int i = 0; i < row; i++) - bfs(grid, row, col, i, 0); - for (int i = 0; i < row; i++) - bfs(grid, row, col, i, col - 1); - int ans = 0; - for (int i = 0; i < row; i++) - for (int j = 0; j < col; j++) - if (grid[i][j]) +int numEnclaves(int **grid, int gridSize, int *gridColSize) { + int n = gridSize, m = gridColSize[0], ans = 0; + for (int c = 0; c < m; c++) { + if (grid[0][c] == 1) + dfs(grid, 0, c, n, m); + if (grid[n - 1][c] == 1) + dfs(grid, n - 1, c, n, m); + } + for (int r = 1; r < n - 1; r++) { + if (grid[r][0] == 1) + dfs(grid, r, 0, n, m); + if (grid[r][m - 1] == 1) + dfs(grid, r, m - 1, n, m); + } + for (int r = 0; r < n; r++) + for (int c = 0; c < m; c++) + if (grid[r][c] == 1) ans++; return ans; } int main() { - int g1[4][4] = {{0, 0, 0, 0}, {1, 0, 1, 0}, {0, 1, 1, 0}, {0, 0, 0, 0}}; - int g2[4][4] = {{0, 1, 1, 0}, {0, 0, 1, 0}, {0, 0, 1, 0}, {0, 0, 0, 0}}; - int grid_size = 4; - int grid_col_size[] = {4, 4, 4, 4}; - printf("%d\n", numEnclaves(g1, grid_size, grid_col_size)); // expect: 3 - printf("%d\n", numEnclaves(g2, grid_size, grid_col_size)); // expect: 3 + int g1i[4][4] = {{0, 0, 0, 0}, {1, 0, 1, 0}, {0, 1, 1, 0}, {0, 0, 0, 0}}; + int g2i[4][4] = {{0, 1, 1, 0}, {0, 0, 1, 0}, {0, 0, 1, 0}, {0, 0, 0, 0}}; + struct two_d_arr *g1 = + two_d_arr_init(ARRAY_SIZE(g1i), ARRAY_SIZE(g1i[0]), g1i); + struct two_d_arr *g2 = + two_d_arr_init(ARRAY_SIZE(g2i), ARRAY_SIZE(g2i[0]), g2i); + int r1 = numEnclaves(g1->arr, g1->row_size, g1->col_size); + int r2 = numEnclaves(g2->arr, g2->row_size, g2->col_size); + printf("%d\n", r1); // expect: 3 + assert(r1 == 3); + printf("%d\n", r2); // expect: 0 + assert(r2 == 0); } diff --git a/num_enclaves.py b/num_enclaves.py @@ -0,0 +1,41 @@ +# 1020. Number of Enclaves + +""" +given an 'm n' binary matrix grid, where 0 represents a sea +cell and 1 represents a land cell. a move consists of walking +from one land cell to another adjacent (4-directionally) land +cell o walking off the boundary of the 'grid'. return number +of land cells in 'grid' for which we cannot walk off the +boundary of the grid in any number of moves. +""" + + +class Solution(object): + def numEnclaves(self, grid): + """ + :type grid: List[List[int]] + :rtype: int + """ + + def dfs(i, j): + grid[i][j] = 0 + for r, c in (i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1): + if 0 <= r < m and 0 <= c < n and grid[r][c]: + dfs(r, c) + + m, n = len(grid), len(grid[0]) + for i in range(m): + for j in range(n): + if grid[i][j] == 1 and (i == 0 or j == 0 or i == m - 1 or j == n - 1): + dfs(i, j) + return sum(sum(row) for row in grid) + + +if __name__ == "__main__": + obj = Solution() + print( + obj.numEnclaves(grid=[[0, 0, 0, 0], [1, 0, 1, 0], [0, 1, 1, 0], [0, 0, 0, 0]]) + ) + print( + obj.numEnclaves(grid=[[0, 1, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 0, 0]]) + )