200.岛屿数量

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

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

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

示例 1:

输入:grid = [
  ["1","1","1","1","0"],
  ["1","1","0","1","0"],
  ["1","1","0","0","0"],
  ["0","0","0","0","0"]
]
输出:1

示例 2:

输入:grid = [
  ["1","1","0","0","0"],
  ["1","1","0","0","0"],
  ["0","0","1","0","0"],
  ["0","0","0","1","1"]
]
输出:3

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 300
  • grid[i][j] 的值为 '0' 或 '1'

方法一:深度优先搜索

时间复杂度:O(MN)

空间复杂度:O(MN)

 1 /**
 2  * @param {character[][]} grid
 3  * @return {number}
 4  */
 5 var numIslands = function(grid) {
 6     if (!Array.isArray(grid) || grid.length <= 0 || grid[0].length <= 0)
 7         return 0;
 8     let rows = grid.length,
 9         cols = grid[0].length;
10     let marked = new Array(rows);
11     for (let i = 0; i < marked.length; i++) {
12         marked[i] = new Array(cols).fill(false);
13     }
14     let direction = [
15         [-1, 0],
16         [0, 1],
17         [1, 0],
18         [0, -1]
19     ];
20     let count = 0;
21     for (let i = 0; i < rows; i++) {
22         for (let j = 0; j < cols; j++) {
23             if (!marked[i][j] && grid[i][j] === '1') {
24                 count++;
25                 dfs(i, j);
26             }
27         }
28     }
29 
30     function dfs(i, j) {
31         marked[i][j] = true;
32         for (let k = 0; k < direction.length; k++) {
33             let newI = i + direction[k][0];
34             let newJ = j + direction[k][1];
35             if (isValid(newI, newJ) && !marked[newI][newJ] && grid[newI][newJ] === '1') {
36                 dfs(newI, newJ);
37             }
38         }
39     }
40 
41     function isValid(i, j) {
42         return i >= 0 && i < rows && j >= 0 && j < cols;
43     }
44     return count;
45 }

方法二:广度优先搜索

时间复杂度:O(MN)

空间复杂度:O(min(M,N))

 1 /**
 2  * @param {character[][]} grid
 3  * @return {number}
 4  */
 5 var numIslands = function(grid) {
 6     if (!Array.isArray(grid) || grid.length <= 0 || grid[0].length <= 0)
 7         return 0;
 8     let rows = grid.length,
 9         cols = grid[0].length;
10     let marked = new Array(rows);
11     for (let i = 0; i < marked.length; i++) {
12         marked[i] = new Array(cols).fill(false);
13     }
14     let direction = [
15         [-1, 0],
16         [0, 1],
17         [1, 0],
18         [0, -1]
19     ];
20     let count = 0;
21     let queue = [];
22     for (let i = 0; i < rows; i++) {
23         for (let j = 0; j < cols; j++) {
24             if (!marked[i][j] && grid[i][j] === '1') {
25                 count++;
26                 queue.push([i, j]);
27                 marked[i][j] = true;
28                 while (queue.length > 0) {
29                     let [curI, curJ] = queue.pop();
30                     for (let k = 0; k < direction.length; k++) {
31                         let newI = curI + direction[k][0];
32                         let newJ = curJ + direction[k][1];
33                         if (isValid(newI, newJ) && !marked[newI][newJ] && grid[newI][newJ] === '1') {
34                             queue.push([newI, newJ]);
35                             marked[newI][newJ] = true;
36                         }
37                     }
38                 }
39             }
40         }
41     }
42 
43     function isValid(i, j) {
44         return i >= 0 && i < rows && j >= 0 && j < cols;
45     }
46     return count;
47 }

 

posted @ 2021-05-23 23:49  icyyyy  阅读(75)  评论(0)    收藏  举报