返回
强势登陆 leetcode 144 岛屿数量:算法进阶之旅
前端
2024-02-09 22:26:39
前言
大家好,欢迎来到前端算法必刷题系列。今天,我们将共同探索 LeetCode 上的第 144 题:岛屿数量。这道题目看似简单,却蕴藏着丰富的算法思想。掌握它,将为你打开算法进阶之门,在面试中脱颖而出。
题目概述
给你一个由 '1'(陆地)和 '0'(水域)组成的二维网格,计算网格中岛屿的数量。
岛屿总是被水域包围,并且不会有两个岛屿相邻。
算法详解
深度优先搜索(DFS)
DFS 是一种以递归或迭代的方式遍历所有可能的路径的算法。在岛屿数量问题中,我们可以从每个 '1' 开始,对周围的 '1' 进行深度遍历,直到遍历完整个岛屿。
const numIslands = (grid) => {
if (!grid || grid.length === 0) {
return 0;
}
const rows = grid.length;
const cols = grid[0].length;
let count = 0;
const visited = new Array(rows).fill(false).map(() => new Array(cols).fill(false));
for (let i = 0; i < rows; i++) {
for (let j = 0; j < cols; j++) {
if (grid[i][j] === '1' && !visited[i][j]) {
dfs(i, j);
count++;
}
}
}
return count;
function dfs(row, col) {
if (row < 0 || row >= rows || col < 0 || col >= cols || visited[row][col] || grid[row][col] === '0') {
return;
}
visited[row][col] = true;
dfs(row - 1, col); // 上
dfs(row + 1, col); // 下
dfs(row, col - 1); // 左
dfs(row, col + 1); // 右
}
};
广度优先搜索(BFS)
BFS 是一种以队列的方式逐层遍历所有可能的路径的算法。在岛屿数量问题中,我们可以从每个 '1' 开始,将其周围的 '1' 加入队列,然后依次取出队列中的元素,并对它们的周围元素进行遍历。
const numIslands = (grid) => {
if (!grid || grid.length === 0) {
return 0;
}
const rows = grid.length;
const cols = grid[0].length;
let count = 0;
const visited = new Array(rows).fill(false).map(() => new Array(cols).fill(false));
for (let i = 0; i < rows; i++) {
for (let j = 0; j < cols; j++) {
if (grid[i][j] === '1' && !visited[i][j]) {
bfs(i, j);
count++;
}
}
}
return count;
function bfs(row, col) {
const queue = [[row, col]];
while (queue.length > 0) {
const [row, col] = queue.shift();
if (row < 0 || row >= rows || col < 0 || col >= cols || visited[row][col] || grid[row][col] === '0') {
continue;
}
visited[row][col] = true;
queue.push([row - 1, col]); // 上
queue.push([row + 1, col]); // 下
queue.push([row, col - 1]); // 左
queue.push([row, col + 1]); // 右
}
}
};
总结
LeetCode 144 岛屿数量算法是面试中常见的题目之一。掌握 DFS 和 BFS 两种算法,将为你打开算法进阶之门。同时,这道题目也是对编程基本功的考验,需要你对数据结构和算法有深入的理解。
希望今天的分享能够帮助你更好地理解岛屿数量算法。如果您还有任何疑问,欢迎在评论区留言,我将尽力解答。