岛屿数量

题目描述

  1. 题目地址:https://leetcode.cn/problems/number-of-islands/
  2. 题目要求
    给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

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

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

image

解题代码

 // 深度优先
var numIslands = function(grid) {
 const glen = grid.length
 const hlen = grid[0].length
 let count = 0
 if(!glen) return 

 const dfs = (i,j)=>{
     // 下标越界或不是陆地
     if(i<0 ||i >=glen||j<0||j>=hlen||grid[i][j]==='0') return
     // 避免重复计算,将1变为0
     grid[i][j]='0'
     // 检验它的上下左右方向有没有陆地
     dfs(i+1,j)
     dfs(i-1,j)
     dfs(i,j+1)
     dfs(i,j-1)
 }

for(let i=0; i<glen; i++){
    for(let j=0;j<hlen;j++){
        // 找到陆地所属的一整块岛屿,整个岛屿原本的‘1’都被置‘0’
        if(grid[i][j]==='1'){
            dfs(i,j)
            count++
        }
    }
}
return count
};


// 广度优先
const numIslands = (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]) //加入队列
                turnZero(queue, grid)
            }
        }
    }
    return count
}
function turnZero(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]) //四周的节点加入队列
        }
    }
}

posted @ 2022-10-03 14:48  fionna  阅读(23)  评论(0编辑  收藏  举报