LeetCode岛屿最大面积

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

思路:

  看到岛屿问题就觉得挺亲切的。因为岛屿问题似乎都可以用一个思路解决:找到陆地后,按照深度优先搜索的方式,一直根据它向外扩展,扩展到的地方我们就将这个陆地变成海洋。这样一来,每个岛屿我们都可以在计算出面积的同时让它从地图上“消失”,避免二次计算。

  具体思路就是:我们遍历整个二维数组的每一个地方,如果是海洋就跳过,如果是陆地,就送入我们的递归函数——任何陆地,只要送入我们的递归函数,这块陆地所连通的整个岛屿都会被我们变成海洋和处理。

代码:

class Solution(object):

    def maxAreaOfIsland(self, grid):

        n = len(grid)#行数

        m = len(grid[0])#列数

        def dfs(i,j,grid):#传入当前位置和地图

            # global area #声明 这里的res是之前定义的全局变量

            if i<0 or i >=n or j<0 or j>=m:#如果当前位置越界了

                return

            if grid[i][j]==1#如果当前位置是岛屿

                area[0]+=1#area代表面积,+1

                grid[i][j]=0#这个面积已经加过了,置为0

                dfs(i-1,j,grid)#把上下左右送去递归

                dfs(i+1,j,grid)#写这四步不需要考虑是否越界

                dfs(i,j-1,grid)#因为进入dfs后会再判断

                dfs(i,j+1,grid)

        max_iland=0#岛屿最大面积

        area = [0]#area[0]用来临时存储每个岛屿的面积

        #正式开始

        for i in range(n):

            for j in range(m):#两层循环,遍历每一个格子

                if grid[i][j]==1:#如果遍历到了陆地

                    area[0] = 0#先将它置为0

                    dfs(i,j,grid)#对这一小块陆地进行扩展

                    #扩展结束,此时area面积就是那个岛屿的面积

                    #进行岛屿最大面积的更新

                    max_iland = max(area[0],max_iland)

        #返回最终的岛屿最大面积

        return max_iland

小结:

  代码中area用列表的形式存储,之前说过了算是一个小技巧,因为它可以起到全局变量的作用。如果简单定义成值的话,LeetCode编译器会因找不到变量声明而报错,用列表存储就可以了。

 

posted @   JunanP  阅读(21)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示