LeetCode第200题孤岛数量,题目地址。
题目描述:
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
例子:
输入:
11110
11010
11000
00000
输出: 1
解题:DFS
分析根据题意,陆地连接方式:上下左右,错对角不算连接。考虑将遍历过的孤岛元素(能连接上的岛屿)值设置为0,避免二次遍历。当然你也可以假设这个矩阵是int[][],不妨碍使用上述思路解决问题。
class Solution {
void dfs(char[][] grid, int r, int c) {
int nr = grid.length;
int nc = grid[0].length;
if (r < 0 || c < 0 || r >= nr || c >= nc || grid[r][c] == '0') {
return;
}
grid[r][c] = '0';
dfs(grid, r - 1, c);
dfs(grid, r + 1, c);
dfs(grid, r, c - 1);
dfs(grid, r, c + 1);
}
public int numIslands(char[][] grid) {
if (grid == null || grid.length == 0) {
return 0;
}
int nr = grid.length;
int nc = grid[0].length;
int num_islands = 0;
for (int r = 0; r < nr; ++r) {
for (int c = 0; c < nc; ++c) {
if (grid[r][c] == '1') {
++num_islands;
dfs(grid, r, c);
}
}
}
return num_islands;
}
}
复杂度:
时间复杂度:O(MN),遍历全部元素。
空间复杂度:O(1),需要存一些常量。
20200605D
岛屿的变种题
LeetCode第695题,岛屿的最大面积,题目地址。
题目描述:
给定一个包含了一些 0 和 1 的非空二维数组 grid 。
一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)
例子:
[[0,0,1,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,1,1,0,1,0,0,0,0,0,0,0,0],
[0,1,0,0,1,1,0,0,1,0,1,0,0],
[0,1,0,0,1,1,0,0,1,1,1,0,0],
[0,0,0,0,0,0,0,0,0,0,1,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,0,0,0,0,0,0,1,1,0,0,0,0]]
答案:6,岛屿只能包含垂直和水平方向。
解题:
分析:相比于上题,这里的dfs函数需要有返回值,返回值表示岛屿的数量,也就是全连同的1的个数。
class Solution {
public int maxAreaOfIsland(int[][] grid) {
int res = 0;
for (int i = 0; i < grid.length; i++){
for (int j = 0; j < grid[0].length; j++){
if (grid[i][j] == 1){
res = Math.max(res, dfs(i,j,grid));
}
}
}
return res;
}
public int dfs (int i, int j, int[][] grid){
if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] == 0){
return 0;
}
grid[i][j] = 0;
int num = 1;//能进来,默认为1,进来dfs的条件就是grid[i][j]=1
num += dfs(i+1,j, grid);
num += dfs(i-1,j, grid);
num += dfs(i,j+1, grid);
num += dfs(i,j-1, grid);
return num;
}
}
参考LeetCode:
孤岛数量:https://leetcode-cn.com/problems/number-of-islands/
岛屿最大面积:https://leetcode-cn.com/problems/max-area-of-island