1. 题目描述

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

  1. 输入:
  2. [
  3. ['1','1','1','1','0'],
  4. ['1','1','0','1','0'],
  5. ['1','1','0','0','0'],
  6. ['0','0','0','0','0']
  7. ]
  8. 输出: 1

示例 2:

  1. 输入:
  2. [
  3. ['1','1','0','0','0'],
  4. ['1','1','0','0','0'],
  5. ['0','0','1','0','0'],
  6. ['0','0','0','1','1']
  7. ]
  8. 输出: 3
  9. 解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

2. 解题思路

这个题目的描述很多,实际上就是说,所有在水平和竖直方向连在一起的算是一个岛屿,我们只要计算岛屿的数量即可。

  • 使用深度优先遍历,遍历所有的元素,如果一个元素是1,就遍历其周围元素将其在水平与数值方向的周围元素值为1的都变为0,然后累加岛屿的数量。
  • 使用广度优先遍历,将当前遍历到的元素存入到队列中,然后检查其上下左右的元素,如果是1,就放进队列,并将其变为0。一直取队列最后的元素进行上下左右的检查。

    3. 代码实现

    DFS:

    1. /**
    2. * @param {character[][]} grid
    3. * @return {number}
    4. */
    5. var numIslands = function(grid) {
    6. if(grid.length < 1){
    7. return 0
    8. }
    9. let isLands = 0
    10. for(let i = 0; i< grid.length; i++){
    11. for(let j = 0; j< grid[0].length; j++){
    12. if(grid[i][j] == 1){
    13. isLands++
    14. // 遍历其周围的岛屿,如果是1,就将其变为0
    15. dfs(grid, i, j)
    16. }
    17. }
    18. }
    19. return isLands
    20. };
    21. // 深度优先遍历,分别遍历元素的上下左右四个元素,如果是1,就变成0
    22. var dfs = function(grid, i, j){
    23. grid[i][j] = 0
    24. if(grid[i-1] && grid[i-1][j] == 1){
    25. dfs(grid, i-1, j)
    26. }
    27. if(grid[i+1] && grid[i+1][j] == 1){
    28. dfs(grid, i+1, j)
    29. }
    30. if(grid[i][j-1] && grid[i][j-1] == 1){
    31. dfs(grid, i, j-1)
    32. }
    33. if(grid[i][j+1] && grid[i][j+1] == 1){
    34. dfs(grid, i, j+1)
    35. }
    36. }

    BFS:

    1. /**
    2. * @param {character[][]} grid
    3. * @return {number}
    4. */
    5. var numIslands = function(grid) {
    6. if(grid.length < 1){
    7. return 0
    8. }
    9. let isLands = 0
    10. let len1 = grid.length
    11. let len2 = grid[0].length
    12. for(let i = 0; i< len1; i++){
    13. for(let j = 0; j< len2; j++){
    14. if(grid[i][j] == 1){
    15. isLands++
    16. grid[i][j] = 0 // 将当前元素置为0,避免重复遍历
    17. let queue = []
    18. queue.push([i, j])
    19. while(queue.length > 0){
    20. let cur = queue.shift() // 取出队列最后面的元素
    21. let x = cur[0], y = cur[1]
    22. // 对元素进行上下左右检查
    23. if(x-1 >= 0 && grid[x-1][y] == 1){
    24. queue.push([x-1,y])
    25. grid[x-1][y] = 0
    26. }
    27. if(x+1 < len1 && grid[x+1][y] == 1){
    28. queue.push([x+1,y])
    29. grid[x+1][y] = 0
    30. }
    31. if(y-1 >= 0 && grid[x][y-1] == 1){
    32. queue.push([x,y-1])
    33. grid[x][y-1] = 0
    34. }
    35. if(y+1 < len2 && grid[x][y+1] == 1){
    36. queue.push([x,y+1])
    37. grid[x][y+1] = 0
    38. }
    39. }
    40. }
    41. }
    42. }
    43. return isLands
    44. };

    4. 提交结果

    DFS:
    200. 岛屿数量 - 图1
    BFS:
    200. 岛屿数量 - 图2