一、题目描述
给你一个大小为 m x n
的二进制矩阵 grid
。
岛屿是由一些相邻的 1
(代表土地)构成的组合,这里的相邻要求两个 1
必须在水平或者竖直的四个方向上相邻。你可以假设 grid
的四个边缘都被 0
(代表水)包围着。
岛屿的面积是岛上值为 1
的单元格的数目。
计算并返回 grid
中最大的岛屿面积。如果没有岛屿,则返回面积为 0
。
输入: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
二、题解
通过回溯法处理,时间复杂度和空间复杂度均为 O ( m × n ) O(m \times n) O(m×n):
class Solution {
private:
int max_area = 0;
int cur_area = 0;
int m, n;
public:
int maxAreaOfIsland(vector<vector<int>> &grid) {
/* 获取网格的长和宽 */
m = grid.size();
n = grid.at(0).size();
/* 从左到右,从上到下遍历,因为每个访问过的节点都会被置0,所以不用担心重复的问题。 */
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
backtracking(grid, i, j);
max_area = max(max_area, cur_area);
cur_area = 0; // 每个岛屿处理完要将cur_area置0
}
}
/* 返回最大面积 */
return max_area;
}
void backtracking(vector<vector<int>> &grid, int row, int col) {
/* 越界检查 */
if (row < 0 || row >= m || col < 0 || col >= n) {
return;
}
/* 处理土地节点 */
if (grid.at(row).at(col)) {
grid.at(row).at(col) = 0;
cur_area++;
/* 处理相邻的节点 */
backtracking(grid, row, col + 1);
backtracking(grid, row, col - 1);
backtracking(grid, row + 1, col);
backtracking(grid, row - 1, col);
}
}
};