695 岛屿的最大面积(dfs求解连通块中1的最大数目)

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

版权声明:本文为qq_39445165原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。