200. 岛屿数量

200. 岛屿数量

leetcode 200. 岛屿数量


题目:200. 岛屿数量

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

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

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

示例1:

输入:
[
[‘1’,’1’,’1’,’1’,’0’],
[‘1’,’1’,’0’,’1’,’0’],
[‘1’,’1’,’0’,’0’,’0’],
[‘0’,’0’,’0’,’0’,’0’]
]
输出: 1

示例2:

输入:
[
[‘1’,’1’,’0’,’0’,’0’],
[‘1’,’1’,’0’,’0’,’0’],
[‘0’,’0’,’1’,’0’,’0’],
[‘0’,’0’,’0’,’1’,’1’]
]
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

方法:DFS(深度优先搜索)

思路:DFS(深度优先搜索),遍历矩阵,值为1时进行一次DFS,搜索所有与它水平或垂直相邻的值为’1’的位置,将已搜索过的’1’赋值为’0’,返回DFS的运行次数,即为岛屿数。

运行数据:执行用时:2 ms,内存消耗:42.2 MB

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
// LeetCode指定调用方法     
public int numIslands(char[][] grid) {

int result = 0;

for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {

// 值为'1'时进行一次DFS
if (grid[i][j] == '1') {
dfs(grid, i, j);
result++;
}
}
}

return result;
}

// DFS
private void dfs(char[][] grid, int a, int b) {

// 该位置已超出矩阵限制或该位置值为'0',结束搜索
if (a < 0 || b < 0 || a >= grid.length || b >= grid[0].length || grid[a][b] == '0') {
return ;
}

// 将已搜索过的'1'赋值为'0'
grid[a][b] = '0';

// 递归搜索4个方向
dfs(grid, a + 1, b);
dfs(grid, a - 1, b);
dfs(grid, a, b + 1);
dfs(grid, a, b - 1);
}

学习所得,资料、图片部分来源于网络,如有侵权,请联系本人删除。

才疏学浅,若有错误或不当之处,可批评指正,还请见谅!


 
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×