Number of Enclaves

medium array dfs bfs matrix

Problem

Given a binary grid where 1 is land, return the number of land cells from which you cannot walk off the edge in 4 directions.

Inputgrid = [[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]]
Output3
DFS from every border 1 erasing reachable land; count remaining 1s.

def numEnclaves(grid):
    R, C = len(grid), len(grid[0])
    def dfs(r, c):
        if r < 0 or r >= R or c < 0 or c >= C or grid[r][c] != 1: return
        grid[r][c] = 0
        for dr, dc in [(1,0),(-1,0),(0,1),(0,-1)]:
            dfs(r + dr, c + dc)
    for r in range(R):
        dfs(r, 0); dfs(r, C - 1)
    for c in range(C):
        dfs(0, c); dfs(R - 1, c)
    return sum(grid[r][c] for r in range(R) for c in range(C))
function numEnclaves(grid) {
  const R = grid.length, C = grid[0].length;
  function dfs(r, c) {
    if (r < 0 || r >= R || c < 0 || c >= C || grid[r][c] !== 1) return;
    grid[r][c] = 0;
    dfs(r + 1, c); dfs(r - 1, c); dfs(r, c + 1); dfs(r, c - 1);
  }
  for (let r = 0; r < R; r++) { dfs(r, 0); dfs(r, C - 1); }
  for (let c = 0; c < C; c++) { dfs(0, c); dfs(R - 1, c); }
  let count = 0;
  for (let r = 0; r < R; r++) for (let c = 0; c < C; c++) count += grid[r][c];
  return count;
}
class Solution {
    int R, C; int[][] g;
    public int numEnclaves(int[][] grid) {
        g = grid; R = grid.length; C = grid[0].length;
        for (int r = 0; r < R; r++) { dfs(r, 0); dfs(r, C - 1); }
        for (int c = 0; c < C; c++) { dfs(0, c); dfs(R - 1, c); }
        int count = 0;
        for (int r = 0; r < R; r++) for (int c = 0; c < C; c++) count += g[r][c];
        return count;
    }
    void dfs(int r, int c) {
        if (r < 0 || r >= R || c < 0 || c >= C || g[r][c] != 1) return;
        g[r][c] = 0;
        dfs(r + 1, c); dfs(r - 1, c); dfs(r, c + 1); dfs(r, c - 1);
    }
}
int numEnclaves(vector<vector<int>>& grid) {
    int R = (int)grid.size(), C = (int)grid[0].size();
    function<void(int, int)> dfs = [&](int r, int c) {
        if (r < 0 || r >= R || c < 0 || c >= C || grid[r][c] != 1) return;
        grid[r][c] = 0;
        dfs(r + 1, c); dfs(r - 1, c); dfs(r, c + 1); dfs(r, c - 1);
    };
    for (int r = 0; r < R; r++) { dfs(r, 0); dfs(r, C - 1); }
    for (int c = 0; c < C; c++) { dfs(0, c); dfs(R - 1, c); }
    int count = 0;
    for (int r = 0; r < R; r++) for (int c = 0; c < C; c++) count += grid[r][c];
    return count;
}
Time: O(R · C) Space: O(R · C)