You are given an m x 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 or walking off the boundary of the grid.
Return the number of land cells in grid for which we cannot walk off the boundary of the grid in any number of moves.
Example 1:
Input: grid = [
[0,1,0,0],
[1,1,0,0],
[0,0,1,0],
[0,0,0,1]
]
Output: 1 Example 2:
Input: grid = [
[1,0,0,0],
[0,1,1,0],
[0,1,0,1],
[1,0,0,1]
]
Output: 3 Constraints:
1 <= grid.length, grid[i].length <= 500grid[i][j] is either 0 or 1.class Solution:
def numEnclaves(self, grid: List[List[int]]) -> int:
ROWS, COLS = len(grid), len(grid[0])
direct = [[0, 1], [0, -1], [1, 0], [-1, 0]]
# Return num of land cells
def dfs(r, c):
if (r < 0 or c < 0 or
r == ROWS or c == COLS or
not grid[r][c] or (r, c) in visit):
return 0
visit.add((r, c))
res = 1
for dr, dc in direct:
res += dfs(r + dr, c + dc)
return res
visit = set()
land, borderLand = 0, 0
for r in range(ROWS):
for c in range(COLS):
land += grid[r][c]
if (grid[r][c] and (r, c) not in visit and
(c in [0, COLS - 1] or r in [0, ROWS - 1])):
borderLand += dfs(r, c)
return land - borderLandWhere is the number of rows and is the number of columns in the given grid.
class Solution:
def numEnclaves(self, grid: list[list[int]]) -> int:
ROWS, COLS = len(grid), len(grid[0])
direct = [[0, 1], [0, -1], [1, 0], [-1, 0]]
visit = [[False] * COLS for _ in range(ROWS)]
q = deque()
land, borderLand = 0, 0
for r in range(ROWS):
for c in range(COLS):
land += grid[r][c]
if (grid[r][c] == 1 and
(r in [0, ROWS - 1] or c in [0, COLS - 1])
):
q.append((r, c))
visit[r][c] = True
while q:
r, c = q.popleft()
borderLand += 1
for dr, dc in direct:
nr, nc = r + dr, c + dc
if (0 <= nr < ROWS and 0 <= nc < COLS and
grid[nr][nc] == 1 and not visit[nr][nc]
):
q.append((nr, nc))
visit[nr][nc] = True
return land - borderLandWhere is the number of rows and is the number of columns in the given grid.
class DSU:
def __init__(self, n):
self.Parent = list(range(n + 1))
self.Size = [1] * (n + 1)
def find(self, node):
if self.Parent[node] != node:
self.Parent[node] = self.find(self.Parent[node])
return self.Parent[node]
def union(self, u, v):
pu, pv = self.find(u), self.find(v)
if pu == pv:
return False
if self.Size[pu] >= self.Size[pv]:
self.Size[pu] += self.Size[pv]
self.Parent[pv] = pu
else:
self.Size[pv] += self.Size[pu]
self.Parent[pu] = pv
return True
class Solution:
def numEnclaves(self, grid: list[list[int]]) -> int:
ROWS, COLS = len(grid), len(grid[0])
N = ROWS * COLS
def index(r, c):
return r * COLS + c
dsu = DSU(N)
directions = [0, 1, 0, -1, 0]
land = 0
for r in range(ROWS):
for c in range(COLS):
if grid[r][c] == 0:
continue
land += 1
for d in range(4):
nr, nc = r + directions[d], c + directions[d + 1]
if 0 <= nr < ROWS and 0 <= nc < COLS:
if grid[nr][nc] == 1:
dsu.union(index(r, c), index(nr, nc))
else:
dsu.union(N, index(r, c))
borderLand = dsu.Size[dsu.find(N)]
return land - borderLand + 1Where is the number of rows and is the number of columns in the given grid.