给你一个大小为 m x n 的二进制矩阵 grid 。
岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
岛屿的面积是岛上值为 1 的单元格的数目。
计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。
示例1:
输入:grid = [[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
解释:答案不应该是 11 ,因为岛屿只能包含水平或垂直这四个方向上的 1 。
示例2:
输入:grid = [[0,0,0,0,0,0,0,0]]
输出:0
提示
1. m == grid.length
2. n == grid[i].length
3. 1 <= m, n <= 50
4. grid[i][j] 为 0 或 1
首先这是一个大小为 m x n 的二进制矩阵 grid,这就说明矩阵内只有01两个数值,1代表陆地,0代表水域,这题就是让我们求解连接在一起的1的最大数量,并且连接方向也给出了是水平或者竖直的四个方向,这题和昨天那题岛屿的周长比较类似,我们也需要对这个矩阵进行一次遍历,每次遍历到的点如果是1且未访问过则进入dfs,然后在访问完当前点之后再访问当前点的上下左右四个方向的点,递归搜索判断,下面我们进入代码。
首先是主函数中的对矩阵的遍历
class Solution {
int m, n;
int maxAreaOfIsland(vector<vector<int>>& grid) {
m = int(grid.size());
n = int(grid[0].size());
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
dfs(grid, i, j);
}
}
}
}
然后我们需要记录每一次dfs搜索的陆地大小并且与当前记录的最大大小进行一个求较大值(当前的大小我们用res记录,赋初值为-1是为了让它为最小)因为这个记录数需要在主函数且dfs函数里都出现,所以跟m,n一样定义到类里
class Solution {
int m, n;
int count = 0;
int maxAreaOfIsland(vector<vector<int>>& grid) {
m = int(grid.size());
n = int(grid[0].size());
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
count = 0;
dfs(grid, i, j);
res = max(res, count);
}
}
}
}
然后是dfs函数,在进入dfs后对每个访问的点进行标记,出口条件仍然是坐标越界或者当前点值为0或2(代表水域或者已访问过)
void dfs(vector<vector<int>>& grid, int x, int y) {
if(x < 0 || x >= m || y < 0 || y >= n || grid[x][y] != 1 || grid[x][y] == 2) {
return;
}
grid[x][y] = 2;
dfs(grid, x + 1, y);
dfs(grid, x - 1, y);
dfs(grid, x, y + 1);
dfs(grid, x, y - 1);
}
这里还要注意一点,我们需要在访问并且标记完当前点后把count值+1,代表当前陆地面积值+1,下面是完整代码
完整代码:
class Solution {
public:
int m, n;
int count = 0;
void dfs(vector<vector<int>>& grid, int x, int y) {
if(x < 0 || x >= m || y < 0 || y >= n || grid[x][y] != 1 || grid[x][y] == 2) {
return;
}
grid[x][y] = 2;
++count;
dfs(grid, x + 1, y);
dfs(grid, x - 1, y);
dfs(grid, x, y + 1);
dfs(grid, x, y - 1);
}
int maxAreaOfIsland(vector<vector<int>>& grid) {
int res = -1;
m = int(grid.size());
n = int(grid[0].size());
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
count = 0;
dfs(grid, i, j);
res = max(res, count);
}
}
return res;
}
};