岛屿数量
题目描述
- 题目地址:https://leetcode.cn/problems/number-of-islands/
- 题目要求
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
解题代码
// 深度优先
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]) //四周的节点加入队列
}
}
}