题目描述
给你一个由 '1'
(陆地)和 '0'
(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
样例
输入:
[
['1','1','1','1','0'],
['1','1','0','1','0'],
['1','1','0','0','0'],
['0','0','0','0','0']
]
输出: 1
输入:
[
['1','1','0','0','0'],
['1','1','0','0','0'],
['0','0','1','0','0'],
['0','0','0','1','1']
]
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。
算法分析
dfs
- 枚举整个地图,若当前位置是
'1'
,则把这个位置连着的陆地都全部遍历完赋值为'#'
,表示这块岛屿已经遍历完,则记录该岛屿
时间复杂度 $O(nm)$
JaVA 代码
class Solution {
static int ans = 0;
static int n,m;
static int[] dx = new int[]{-1, 0, 1, 0};
static int[] dy = new int[]{0, -1, 0, 1};
static void dfs(char[][] grid,int x,int y)
{
grid[x][y] = '#';
for(int i = 0;i < 4;i ++)
{
int a = x + dx[i];
int b = y + dy[i];
if(a < 0 || a >= n || b < 0 || b >= m) continue;
if(grid[a][b] == '1') dfs(grid, a, b);
}
}
public int numIslands(char[][] grid) {
n = grid.length;
if(n == 0) return 0;
m = grid[0].length;
ans = 0;
for(int i = 0;i < n;i ++)
for(int j = 0;j < m;j ++)
if(grid[i][j] == '1')
{
ans ++;
dfs(grid,i,j);
}
return ans;
}
}
贴一个
BFS
的解法,DFS
和BFS
详解 见 详细题解:-
DFS
:时间 O(mn), 空间 O(mn
)-
BFS
:时间 O(mn), 空间 O(min(m, n)
)