0%

Leetcode 200 Number Of Islands

Given an m x n 2d grid map of '1's (land) and '0's (water), return the number of islands.

An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.

Example 1:

1
2
3
4
5
6
7
Input: grid = [
["1","1","1","1","0"],
["1","1","0","1","0"],
["1","1","0","0","0"],
["0","0","0","0","0"]
]
Output: 1

Example 2:

1
2
3
4
5
6
7
Input: grid = [
["1","1","0","0","0"],
["1","1","0","0","0"],
["0","0","1","0","0"],
["0","0","0","1","1"]
]
Output: 3

Constraints:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 300
  • grid[i][j] is '0' or '1'.

深度优先

肯定是挨个遍历二维数组的元素值了.

对于每一个遍历的位置(i, j), 如果该位置是1, 那么说明找到了一个岛屿, cnt自加, 并且把和这个1相连的所有1都置为2. 表示这个岛屿已经遍历过了, 接下来不应该再被计算一次. 用深度优先遍历所有与这个1相连的1即可.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution {
public int numIslands(char[][] grid) {
int cnt = 0;
for(int i = 0; i < grid.length; ++i)
{
for(int j = 0; j < grid[0].length; ++j)
{
if(grid[i][j] == '1')
{
++cnt;
traverseIsland(grid, i, j);
}
}
}
return cnt;
}
private void traverseIsland(char[][] grid, int i, int j)
{
if(!isLocationValid(grid, i, j))
return;
if(grid[i][j] == '2')
return;
if(grid[i][j] == '1')
{
grid[i][j] = '2';
traverseIsland(grid, i - 1, j);
traverseIsland(grid, i + 1, j);
traverseIsland(grid, i, j - 1);
traverseIsland(grid, i, j + 1);
}
}
private boolean isLocationValid(char[][] grid, int i, int j)
{
int m = grid.length;
int n = grid[0].length;
return i > -1 && i < m && j > -1 && j < n;
}
}