1、题目描述:
给你一个大小为 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
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 50
grid[i][j]
为0
或1
2、代码:
#include <vector>
using namespace std;
class Solution
{
public:
/**
* @brief 计算二维网格中最大岛屿面积
* @param grid 二维网格数组,1表示陆地,0表示水域
* @return 最大岛屿面积(如果没有岛屿返回0)
*
* 算法思路:
* 1. 遍历网格中的每个单元格
* 2. 当发现陆地(值为1)时,启动深度优先搜索
* 3. 通过DFS计算当前岛屿面积并更新最大值
*/
int maxAreaOfIsland(vector<vector<int>>& grid)
{
// 处理空网格的特殊情况
if (grid.empty()) {
return 0;
}
int max_area = 0; // 记录最大面积
// 遍历所有网格单元
for (int i = 0; i < grid.size(); i++) {
for (int j = 0; j < grid[0].size(); j++) {
// 只在发现未访问的陆地时启动DFS
if (grid[i][j] == 1) {
// 计算当前岛屿面积并更新最大值
max_area = max(max_area, dfs(grid, i, j));
}
}
}
return max_area;
}
private:
/**
* @brief 深度优先搜索计算岛屿面积
* @param grid 二维网格数组(会被修改标记已访问区域)
* @param i 当前行坐标
* @param j 当前列坐标
* @return 当前岛屿的面积
*
* 算法细节:
* 1. 先进行边界检查,防止数组越界
* 2. 检查当前是否为未访问的陆地(值仍为1)
* 3. 标记当前单元格为已访问(置为0)
* 4. 递归探索四个相邻方向并累加面积
*/
int dfs(vector<vector<int>>& grid, int i, int j)
{
// 终止条件:坐标越界或遇到水域/已访问区域
if (i < 0 || j < 0 ||
i >= grid.size() || j >= grid[0].size() ||
grid[i][j] == 0) {
return 0;
}
// 标记当前单元格为已访问(沉岛法)
grid[i][j] = 0;
// 递归探索四个方向并累加面积
return 1 + dfs(grid, i - 1, j) // 向上探索
+ dfs(grid, i + 1, j) // 向下探索
+ dfs(grid, i, j - 1) // 向左探索
+ dfs(grid, i, j + 1); // 向右探索
}
};
3、解题思路:
- 遍历网格:逐个访问每个单元格,当遇到陆地(值为1)时,启动DFS计算该岛屿的面积。
- DFS计算面积:递归访问当前单元格的上下左右四个方向,将访问过的陆地标记为0,同时统计所有连接的陆地单元格数量。
- 更新最大值:每次计算完一个岛屿的面积后,更新最大面积值。
-
主函数
maxAreaOfIsland
:- 遍历整个网格,对每个单元格进行检查。
- 当发现陆地时,调用DFS函数计算该岛屿的面积,并更新最大面积。
-
辅助函数
dfs
:- 检查当前单元格是否越界或是否为水(0),若是则返回0。
- 将当前单元格标记为已访问(置为0),防止重复计算。
- 递归访问当前单元格的上下左右四个方向,统计所有连接的陆地单元格数量之和,并返回该面积。