leetcode_1020 飞地的数量

110 阅读1分钟

要求

给出一个二维数组 A,每个单元格为 0(代表海)或 1(代表陆地)。

移动是指在陆地上从一个地方走到另一个地方(朝四个方向之一)或离开网格的边界。

返回网格中无法在任意次数的移动中离开网格边界的陆地单元格的数量。

示例 1:

输入:[[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]]
输出:3
解释: 
有三个 10 包围。一个 1 没有被包围,因为它在边界上。

示例 2:

输入:[[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0]]
输出:0
解释:
所有 1 都在边界上或可以到达边界。

提示:

  • 1 <= A.length <= 500
  • 1 <= A[i].length <= 500
  • 0 <= A[i][j] <= 1
  • 所有行的大小都相同

核心代码

class Solution:
    def numEnclaves(self, grid: List[List[int]]) -> int:
        m,n = len(grid),len(grid[0])
        def dfs(x,y):
            dx = [0,1,-1,0]
            dy = [-1,0,0,1]
            for k in range(4):
                xx = x + dx[k]
                yy = y + dy[k]

                if xx >= 0 and xx < m and yy >= 0 and yy < n:
                    if grid[xx][yy] == 1:
                        grid[xx][yy] = 2
                        dfs(xx,yy)
    
        i = 0
        # 上边
        for j in range(n):
            if grid[i][j] == 1:
                grid[i][j] = 2
                dfs(i,j)

        i = m - 1
        # 下边
        for j in range(n):
            if grid[i][j] == 1:
                grid[i][j] = 2
                dfs(i,j)
        
        j = n - 1
        # 右边
        for i in range(m):
            if grid[i][j] == 1:
                grid[i][j] = 2
                dfs(i,j)

        j = 0
        # 左边
        for i in range(m):
            if grid[i][j] == 1:
                grid[i][j] = 2
                dfs(i,j)

        res = 0
        for i in range(m):
            for j in range(n):
                if grid[i][j] == 1:
                    res += 1
        return res

image.png

解题思路:对四条边上的1进行DFS找所有能到达的1, 找到了满足条件的1,就把它染色成2。最后所有能接触到边界的1,都会被染色成2,剩下来的飞地,值就还是1,统计一下1的个数即可