LeetCode200 岛屿数量
题目
解题
解题一:深度优先搜索
var numIslands = function(grid) {
const m = grid.length, n = grid[0].length;
const directions = [[0, 1], [0, -1], [1, 0], [-1, 0]];
let isLandsCnt = 0;
const dfs = (i, j) => {
// 如果遍历过,则会将 1 改为 0,因为没有额外的 neighbours 来记录,所以不会重复遍历
grid[i][j] = '0';
for (const [movei, movej] of directions) {
const newi = i + movei, newj = j + movej;
if (newi >= 0 && newi < m && newj >= 0 && newj < n && grid[newi][newj] === '1') {
dfs(newi, newj);
}
}
};
for (let i = 0; i < m; ++i) {
for (let j = 0; j < n; ++j) {
if (grid[i][j] === '1') {
isLandsCnt++;
dfs(i, j);
}
}
}
return isLandsCnt;
};
解题二:广度优先搜索
// javascript
var numIslands = function(grid) {
const m = grid.length, n = grid[0].length;
const directions = [[0, 1], [0, -1], [1, 0], [-1, 0]];
let isLandsCnt = 0;
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (grid[i][j] === '1') {
isLandsCnt++;
grid[i][j] = '0';
const neighbors = [[i, j]];
while (neighbors.length > 0) {
const [row, col] = neighbors.shift();
for (const [mover, movec] of directions) {
const newr = row + mover, newc = col + movec;
if (newr >= 0 && newr < m && newc >= 0 && newc < n && grid[newr][newc] === '1') {
grid[newr][newc] = '0'; // 避免重复被 push 进 neighbors
neighbors.push([newr, newc]);
}
}
}
}
}
}
return isLandsCnt;
};