给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
输入:[['1', '1', '1', '1', '0'],['1', '1', '0', '1', '0'],['1', '1', '0', '0', '0'],['0', '0', '0', '0', '0'],];输出: 1;
示例 2:
输入:[['1','1','0','0','0'],['1','1','0','0','0'],['0','0','1','0','0'],['0','0','0','1','1']]输出: 3解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。
线性扫描整个二维网格,如果一个结点包含 1,则以其为根据点启动深度优先搜索。在深度优先搜索过程中,每个访问过的结点被标记为 0。计数启动深度优先搜索的根节点的数量,即为岛屿的数量。
为什么需要沉岛:
怎么找到同处一岛的所有 1:
const numIslands = function(grid) {let count = 0;for (let i = 0; i < grid.length; i++) {for (let j = 0; j < grid[0].length; j++) {if (grid[i][j] === '1') {// 若出现元素值为 1,则岛屿数量加 1count++;// 使用深度优先遍历将此岛屿所有元素变为 0dfs(i, j, grid);}}}function dfs(i, j, grid) {if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] === '0') {return;}// 将当前格的值设为 0,表示已经遍历过grid[i][j] = '0';// 遍历当前格的上下左右四个dfs(i, j + 1, grid);dfs(i, j - 1, grid);dfs(i + 1, j, grid);dfs(i - 1, j, grid);}return count;};
复杂度分析:
线性扫描整个二维网格,如果一个节点包含 1,则以其为根节点启动广度优先搜索。将其放入队列中,并将值设为 0 以标记访问过该节点。迭代地搜索队列中的每个节点,直到队列为空。
const numIslands = function(grid) {let count = 0;let queue = [];for (let i = 0; i < grid.length; i++) {for (let j = 0; j < grid[0].length; j++) {if (grid[i][j] === '1') {count++;// 标记为已访问grid[i][j] = '0';queue.push([i, j]);bfs(queue, grid);}}}function bfs(queue, grid) {const dirs = [[0, 1],[1, 0],[0, -1],[-1, 0],];while (queue.length) {const cur = queue.shift();for (const dir of dirs) {const x = cur[0] + dir[0];const y = cur[1] + dir[1];if (x < 0 || x >= grid.length || y < 0 || y >= grid[0].length || grid[x][y] !== '1') {continue;}grid[x][y] = '0';queue.push([x, y]);}}}return count;};
复杂度分析: