dfs-二维数组定义理解--统计封闭岛屿数目

67 阅读2分钟

背景:做算法的时候,对于二维数组的定义理解,以及坐标系的变化,如何正确定义二维数组的行和列, 对于二维数组的原点定义,目前看很多算法题目,默认选取了左上顶点为原点,我初始一直不理解,为什么非得用这么别扭的原点,为何不像数学中用到二维坐标系,默认左下角为原点呢,其实问题的根源在于,二维坐标轴的定义,是第几行,第几列 res[row][column]

  • 第一个索引 [row] 代表行。
  • 第二个索引 [column] 代表列。

例如,在一个标准的 m x n 网格中,grid[row][col] 访问的是第 row 行和第 col 列的元素。 所以,如果你定义了左下角为顶点,那么这也就意味着,最终实际二维坐标表示应该是dp[j][i] 所以,一般定义左上角是为了,能保证二维坐标定义符合直觉。

封闭岛屿

二维矩阵 grid 由 0 (土地)和 1 (水)组成。岛是由最大的4个方向连通的 0 组成的群,封闭岛是一个 完全 由1包围(左、上、右、下)的岛。

请返回 封闭岛屿 的数目。

 

示例 1:

输入: grid = [[1,1,1,1,1,1,1,0],[1,0,0,0,0,1,1,0],[1,0,1,0,1,1,1,0],[1,0,0,0,0,1,0,1],[1,1,1,1,1,1,1,0]]
输出: 2
解释:
灰色区域的岛屿是封闭岛屿,因为这座岛屿完全被水域包围(即被 1 区域包围)。

示例 2:

输入: grid = [[0,0,1,0,0],[0,1,0,1,0],[0,1,1,1,0]]
输出: 1
function closedIsland(grid: number[][]): number {
  const m = grid.length;
  const n = grid[0].length;
  const dfs = (i, j) => {

    if (i < 0 || i >= m || j < 0 || j >= n) {
      return
    }
    if (grid[i][j] === 1) {
      return
    }
    grid[i][j] = 1
    dfs(i - 1, j)
    dfs(i + 1, j)
    dfs(i, j - 1)
    dfs(i, j + 1)

  }

  for (let i = 0; i < m; i++) {
    dfs(i, 0)
    dfs(i, n - 1)
  }

  for (let j = 0; j < n; j++) {
    dfs(0, j)
    dfs(m - 1, j)
  }

  let res = 0;
  for (let i = 1; i < m; i++) {
    for (let j = 1; j < n; j++) {
      if (grid[i][j] === 0) {
        dfs(i, j)
        res++
      }
    }
  }

  return res

};