695. 岛屿的最大面积:深度优先搜索解决矩阵中的搜索问题
给你一个大小为 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)必须为水平(左右)或者竖直(上下)的四个方向相邻。要找到岛屿的最大面积,需要首先找到每块岛屿的最大面积(深度优先搜索),然后比较求最大值。
从 [0, 0] 位置开始遍历,遇到 grid[i][j] == 1 时开始深度优先搜索,找到 (i, j) 位置土地所在的岛屿的面积。由于一块土地只能参与构成一片岛屿,所以每遍历一块土地,便可以将矩阵中其对应位置的值置为 0 ,表示已经遍历过,这将避免之后的遍历过程又再次回到之前遍历过的位置从而导致死循环。
深度优先搜索过程中,需要注意首先判断起始位置 (i, j) 是否有效,即其是否仍在矩阵范围内且未遍历过,对于无效位置岛屿面积自然为 0;之后即为从 (i, j) 位置开始的四个方向依次进行后续的深度优先搜索过程,直到找出 (i, j) 位置相连的所有土地从而构成当前这片岛屿。主函数中比较每个位置开始的岛屿面积从而得到最大的岛屿面积。
class Solution {
private:
int directions[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
public:
int dfs(vector<vector<int>>& grid, int i, int j){
if(i < 0 || i >= grid.size() || j < 0 || j >= grid[0].size() || grid[i][j] == 0)
return 0;
grid[i][j] = 0;
int ans = 1;
for(auto direction: directions){
int x = i + direction[0], y = j + direction[1];
ans += dfs(grid, x, y);
}
return ans;
}
int maxAreaOfIsland(vector<vector<int>>& grid) {
int maxArea = 0;
for(int i = 0; i < grid.size(); i++)
for(int j = 0; j < grid[0].size(); j++)
maxArea = max(maxArea, dfs(grid, i, j));
return maxArea;
}
};