leetcode-162周赛-1254-统计封闭岛屿数量
题目描述:
自己的提交:
class Solution: def closedIsland(self, grid: List[List[int]]) -> int: def dfs(grid,r,c): nr = len(grid) nc = len(grid[0]) if r<0 or c<0 or r==nr or c==nc or grid[r][c]==1: return grid[r][c] = 1 dfs(grid,r-1,c) dfs(grid,r+1,c) dfs(grid,r,c-1) dfs(grid,r,c+1) if not grid: return 0 nr = len(grid) nc = len(grid[0]) for i in (0,nr-1): for j in range(nc): if grid[i][j]==0: dfs(grid,i,j) for i in range(nr): for j in (0,nc-1): if grid[i][j]==0: dfs(grid,i,j) num = 0 for i in range(nr): for j in range(nc): if grid[i][j]==0: num += 1 dfs(grid,i,j) return num
另:
class Solution(object): def closedIsland(self, grid): """ :type grid: List[List[int]] :rtype: int """ n, m = len(grid), len(grid[0]) land = set((i,j) for i in xrange(n) for j in xrange(m) if grid[i][j] == 0) seen = set() r = 0 for x in xrange(n): for y in xrange(m): if (x, y) in seen: continue if (x, y) not in land: continue q = set() q.add((x, y)) f = True while q: f = f and all(0<i<n-1 and 0<j<m-1 for i, j in q) seen.update(q) q = set((ii, jj) for i, j in q for ii, jj in ((i-1, j), (i+1, j), (i, j-1), (i, j+1)) if (ii, jj) in land and (ii, jj) not in seen) r += f return r