深情的意义在于他能够在缺乏宏大事件的平凡人生,创造出一段段可以由人定义的时间感的回忆,以体验和羁绊的重量,对抗客观流逝的生命和渺小的自我带给我们轻如鸿毛的存在焦虑。
思路
- 题目要求计算岛屿的数量,那么怎么样从代码的角度去描述一个岛屿的数量呢,我的答案是深度递归的轮数,对给定输入的数组中的节点按照上右下左四个方向深度递归,整个二维数组有几轮深度递归链,那么就有几个岛屿。比如我们遍历这个给定的二维数组(m n),那么一共会遍历m * n个节点,每个节点值要么为1要么为0,先以从左到右从上到下的顺序看第一个节点grid[i][j],我们将它作为一个种子节点,如果这个种子节点是1,那么好,他肯定代表了一个岛屿,接下来就是看看这个岛屿到底有多大,可以理解成把他的临近的陆地都划分到这块岛屿,因为这样我们才好将这个岛屿和其他独立的岛屿相区分,而同一个岛屿的计数不会出现重复。好了,即然已经确定grid[i][j] === 1, 先将它赋值为2,代表我们已经访问过他了(理由见下)。我们就按照上右下左的顺序(grid[i -1][j],grid[i][j+1],grid[i-1][j],grif[i][j-1])查看周围的节点是否为1,如果i,j超出了边界,直接return, 如果为0或者为2,那么也直接return, 作为递归的结束; 如果为1,将其赋值为2,然后再查看这个节点的上右下左四个节点,也就是继续递归这个节点的相邻节点,思想上就是深度优先遍历,一次深度优先遍历的结束,即递归了一轮,计数+1,两层for循环遍历完所有子节点的时候,返回的计数值就是岛屿的数量;
- 为什么要将值为1的节点赋值为2呢,比如我们遍历grid[0][0]的时候,由于递归我们会遍历到grid[0][1]等等节点,等grid[0][0]节点引起的递归遍历的结束的时候,很可能周围大部分节点已经被遍历且重新修改成2了,但是在两层for循环中,grid[0][0]的一轮递归结束后,我们还需要依次访问剩下的grid[0][1],grid[0][2]等等,但是由于grid[0][1]和周围的相邻节点已经在grid[0][0]的一轮递归中被遍历过了,因此在for循环中我们不需要在对grid[0][1]进行深度优先遍历,为了达到这个目的,因此我们把将值为1的节点赋值为2,相当于做了一个标记,表示该节点已经被访问过了。
- 拿个草稿画一画,几分钟就能想明白。
题目
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
输入:grid = [ ["1","1","1","1","0"],
["1","1","0","1","0"],
["1","1","0","0","0"],
["0","0","0","0","0"]
]
输出:1
示例 2:
输入:grid = [ ["1","1","0","0","0"],
["1","1","0","0","0"],
["0","0","1","0","0"],
["0","0","0","1","1"]
]
输出:3
提示:
m == grid.lengthn == grid[i].length1 <= m, n <= 300grid[i][j]的值为'0'或'1'
代码
/**
* @param {character[][]} grid
* @return {number}
*/
/**
* @param {character[][]} grid
* @return {number}
*/
var numIslands = function (grid) {
let n = 0;
let len = grid.length;
let lenColumn = grid[0].length;
for (let i = 0; i < len; i++) {
for (let j = 0; j < grid[i].length; j++) {
if (grid[i][j] === "0") {
continue;
}
if (grid[i][j] === "2") {
continue;
}
if (grid[i][j] === "1") {
const fns = (i, j) => {
// 边界情况
if (i < 0 || i >= len) return;
if (j < 0 || j >= lenColumn) return;
// 数字已经被访问过的情况
if (grid[i][j] === "2") return;
// 数字为0的情况
if (grid[i][j] === "0") return;
//数字为1的情况
if (grid[i][j] === "1") {
// 将值设置为“2”,标记为已经被访问过。
grid[i][j] = "2"
fns(i - 1, j)
fns(i, j + 1)
fns(i + 1, j)
fns(i, j - 1)
}
}
n++;
fns(i, j)
}
}
}
return n;
}