岛屿数量

岛屿数量

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

题目描述

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

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

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

示例 1:

输入:
11110
11010
11000
00000
输出: 1

示例 2:

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

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

广度优先算法

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

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

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

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

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

贴上自己写的代码

/**
 * @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;
};

深度优先算法

做到的时候再补

你可能感兴趣的:(算法)