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

 

posted @ 2019-11-11 16:18  oldby  阅读(209)  评论(0编辑  收藏  举报