LeetCode岛屿最大面积
给你一个大小为 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编译器会因找不到变量声明而报错,用列表存储就可以了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了