1. 问题描述:
给定一个包含了一些 0 和 1 的非空二维数组 grid 。一个岛屿是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)
示例 1:
[[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:
[[0,0,0,0,0,0,0,0]]
对于上面这个给定的矩阵, 返回 0。
注意: 给定的矩阵grid 的长度和宽度都不超过 50。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/max-area-of-island
2. 思路分析:
这是一道计算连通块中1的数目的经典题目,对于连通块的相关题目我们可以使用dfs或者是并查集解决,我比较习惯使用dfs来解决(dfs适合于搜索所有连在一起的位置的问题)。首先我们需要遍历二维矩阵,判断当前位置是否是1,如果是1那么从当前位置开始搜索所有连通的1,每搜索到一个1那么继续往下搜索,并且在搜索的时候将搜过的位置标记为0即可,这样可以避免使用额外的空间来标记哪些位置已经被搜索过了。
3. 代码如下:
from typing import List
class Solution:
# 表示上下左右四个方向
pos = [[0, 1], [0, -1], [1, 0], [-1, 0]]
def dfs(self, grid: List[List[int]], x: int, y: int):
res = 1
grid[x][y] = 0
# 搜索上下左右四个方向的1
for i in range(4):
x0, y0 = x + self.pos[i][0], y + self.pos[i][1]
if 0 <= x0 < len(grid) and 0 <= y0 < len(grid[0]) and grid[x0][y0] == 1:
res += self.dfs(grid, x0, y0)
return res
def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
r, c = len(grid), len(grid[0])
res = 0
for i in range(r):
for j in range(c):
if grid[i][j] == 1:
res = max(res, self.dfs(grid, i, j))
return res