LeetCode20. 岛屿数量(JavaScript解法)

岛屿数量

在这里插入图片描述

题解

思路1:BFS

  • 思路:广度优先搜索,对每个点进行成岛判断,上下左右判断。
  • 分析时间复杂度 O( M * N ) 空间复杂度 O( min( M , N )),空间复杂度为队列的长度,为一层岛屿的数量,为M或N的最小值。
  • 代码实现
const numIslands = (grid) => {
  if (!grid.length) { return 0 }
  let row = grid.length, col = grid[0].length, q = [], res = 0
  for (let i = 0; i < row; i++) {
    for (let j = 0; j < col; j++) {
      if (grid[i][j] == 1) {
        res++
        // 成岛后把他清零,防止影响其他顺序。
        grid[i][j] = 0
        q.push([i, j])
        while (q.length) {
          let [x, y] = q.shift()
          if (x > 0 && grid[x - 1][y] == 1) {
            grid[x - 1][y] = 0
            q.push([x - 1, y])
          }
          if (x < row - 1 && grid[x + 1][y] == 1) {
            grid[x + 1][y] = 0
            q.push([x + 1, y])
          }
          if (y > 0 && grid[x][y - 1] == 1) {
            grid[x][y - 1] = 0
            q.push([x, y - 1])
          }
          if (y < col - 1 && grid[x][y + 1] == 1) {
            grid[x][y + 1] = 0
            q.push([x, y + 1])
          }
        }
      }
    }
  }
  return res
}

思路2:DFS(递归)

  • 思路:深度优先搜索,对每个到选项进行上下左右判断。
  • 分析时间复杂度 O( M * N ) ,空间复杂度 O( M * N ),空间复杂度即递归深度,当所有节点都为1时,就为最大空间复杂度。
  • 代码实现
const dfs = (grid, i, j) => {
  grid[i][j] = 0
  if (grid[i - 1] && grid[i - 1][j] == 1) { dfs(grid, i - 1, j) }
  if (grid[i + 1] && grid[i + 1][j] == 1) { dfs(grid, i + 1, j)}
  if (grid[i][j + 1] && grid[i][j + 1] == 1) {dfs(grid, i, j + 1)}
  if (grid[i][j - 1] && grid[i][j - 1] == 1) {dfs(grid, i, j - 1)}
}
var numIslands = function (grid) {
  if (!grid.length) return 0
  let row = grid.length, col = grid[0].length, count = 0;
  const dfs = (x, y) => {
    // 判断成岛条件
    if (grid[x][y] == 1) {
      grid[x][y] = 0
      // 搜索上下左右四个点
      x > 0 && dfs(x - 1, y);
      x < row - 1 && dfs(x + 1, y);
      y > 0 && dfs(x, y - 1);
      y < col - 1 && dfs(x, y + 1);
    }
  }
  // 注意遍历嵌套关系 先row 再col
  for (let i = 0; i < row; i++) {
    for (let j = 0; j < col; j++) {
      if (grid[i][j] == 1) {
        count++
        dfs(i, j)
      }
    }
  }
  return count
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页