岛屿数量

    技术2022-08-11  94

    岛屿数量

    在力扣探索学习队列的时候,接触到 广度优先算法和深度优先算法 ,解决岛屿数量,在此做一个记录。

    题目描述

    给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

    岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。

    此外,你可以假设该网格的四条边均被水包围。

    示例 1:

    输入: 11110 11010 11000 00000 输出: 1

    示例 2:

    输入: 11000 11000 00100 00011 输出: 3 解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/number-of-islands 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    广度优先算法

    队列借助数组实现队列先进先出的特性,挨个检查队列中的节点

    从第一个节点开始,如果发现节点A是陆地,说明有岛屿,数量加一,A节点加入列表中。

    当列表不为空的时候,循环检查列表,即检查节点A上下左右的节点,发现陆地B,C,则加入队列中,将检查过的节点的值置为0,避免重复加入列表中。

    B出列,检查B,将发现的陆地节点E,F,加入队列。 之后检查C,如果有陆地节点,则加入队列,直至列表为空。

    进入下一个循环,如果发现陆地,数量加一。

    贴上自己写的代码

    /** * @param {character[][]} grid * @return {number} */ var numIslands = function(grid) { var count = 0; var sList = [];//存储要检测的节点 //检查是否是陆地 var isIsland = function(x,y){ if(x>=0 && x < grid.length && y >= 0 && y < grid[0].length && grid[x][y] == 1){ grid[x][y] = '0';//如果是陆地修改为0 表示已经检测过了,避免重复加入列表 return true; } return false; } //检查当前节点的上下左右四个方向上有没有陆地 var checkAndEnqueue = function(x,y){ if(isIsland(x-1,y)){ sList.push({x:x-1,y:y}); } if(isIsland(x+1,y)){ sList.push({x:x+1,y:y}); } if(isIsland(x,y-1)){ sList.push({x:x,y:y-1}); } if(isIsland(x,y+1)){ sList.push({x:x,y:y+1}); } } for(var i = 0;i<grid.length;i++){ var row = grid[i]; for(var j = 0;j<row.length;j++){ var data = row[j]; if(data == 1){ count++;//检测到有陆地,说明有岛屿存在 grid[i][j] = '0';//置为0说明检测过了 sList.push({x:i,y:j});//放入列表中 while(sList.length!=0){//按照队列先进先出的顺序,循环检测列表中的节点 var pos = sList.shift();//取出第一个节点 checkAndEnqueue(pos.x,pos.y);//检测上下左右的节点,然后放到列表中, } } } } return count; };

    深度优先算法

    做到的时候再补

    Processed: 0.015, SQL: 9