返回

强势登陆 leetcode 144 岛屿数量:算法进阶之旅

前端

前言

大家好,欢迎来到前端算法必刷题系列。今天,我们将共同探索 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 两种算法,将为你打开算法进阶之门。同时,这道题目也是对编程基本功的考验,需要你对数据结构和算法有深入的理解。

希望今天的分享能够帮助你更好地理解岛屿数量算法。如果您还有任何疑问,欢迎在评论区留言,我将尽力解答。