写点什么

LeetCode 题解:200. 岛屿数量,DFS,JavaScript,详细注释

用户头像
Lee Chen
关注
发布于: 2021 年 01 月 28 日
LeetCode题解:200. 岛屿数量,DFS,JavaScript,详细注释

原题连接:https://leetcode-cn.com/problems/number-of-islands/


解题思路:


  1. 根据题目描述,假设我们遇到一个坐标grid[i][j] === '1',那么从它开始不断将坐标向上下左右移动,只要坐标的值还是 1,则遇到的所有点都属于同一个岛屿。

  2. 我们可以使用两个嵌套的 for 循环遍历当前网格,如果遇到 1 个坐标为 1,表示遇到了一个岛,此时将岛屿数量加 1。

  3. 同时用 DFS 将当前坐标所有相邻的坐标都设置为 0,也就是将这个岛屿沉没。

  4. 完成递归后,将会继续遍历网格,单剩余岛屿的坐标都已被清零,不会被重复计数。

  5. 当训话结束时,我们就知道了岛屿的数量。


/** * @param {character[][]} grid * @return {number} */var numIslands = function (grid) {  let count = 0; // 统计岛屿数量
// 遍历网格的行 for (let i = 0; i < grid.length; i++) { // 遍历网格的列 for (let j = 0; j < grid[i].length; j++) { // 当遇到1时,表示遇到了岛屿 if (grid[i][j] === '1') { // 将岛屿计数加1 count++; // 使用DFS将当前坐标相邻的1全部改为0,也就是将整个岛屿沉没 // 岛屿所有的坐标都改为0后,之后的遍历不会再遇到这个岛屿的1,确保了不会对岛屿重复计数 sinkIsland(i, j); } } }
// 使用DFS,将当前岛屿所有坐标值都改为0,让当前岛屿沉没 function sinkIsland(i, j) { if ( // 当坐标超出网格时,停止沉岛 i < 0 || j < 0 || i >= grid.length || j >= grid[i].length || // 当遇到水时,停止沉岛 grid[i][j] === '0' ) { return; }
// 将当前坐标的值修改为0 grid[i][j] = '0';
// 将坐标向上下左右4个方向移动,继续修改岛屿的值 sinkIsland(i - 1, j); sinkIsland(i, j - 1); sinkIsland(i + 1, j); sinkIsland(i, j + 1); }
// 返回统计的岛屿数量 return count;};
复制代码


发布于: 2021 年 01 月 28 日阅读数: 18
用户头像

Lee Chen

关注

还未添加个人签名 2018.08.29 加入

还未添加个人简介

评论

发布
暂无评论
LeetCode题解:200. 岛屿数量,DFS,JavaScript,详细注释