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