首页 > 其他分享 >最大岛屿面积

最大岛屿面积

时间:2024-11-15 13:09:14浏览次数:1  
标签:gt 最大 面积 岛屿 len nx ny grid ans

DFS解法

class Solution:
    dir = [(-1,0),(1,0),(0,-1),(0,1)]
    def dfs(self,grid,x,y):
        if x < 0 or x >= len(grid) or y < 0 or y >= len(grid[0]) or grid[x][y] != 1:
            return 0
        grid[x][y] = 0
        ans = 1
        for (dx,dy) in self.dir:
            ans += self.dfs(grid,x+dx,y+dy)
        return ans
    def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
        ans = 0
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                ans = max(ans, self.dfs(grid,i,j))
        return ans

为什么要遍历整个网格?

岛屿可能是多个分离的区域

  • 一个二维网格可能包含多个岛屿,它们彼此不相连。我们不能假设只用一个起点就能发现整个网格中的所有岛屿,因为每个岛屿的起点可能散布在不同的位置。

  • 示例:

grid = [ [1, 0, 0, 1], [1, 0, 1, 0], [0, 0, 1, 0] ]

在上面的示例中有 3 个独立的岛屿:一个位于左上角,一个位于中部,一个位于右下角。因此,必须遍历整个网格以找到所有的岛屿。

DFS 需要从每个可能的起点出发 当你遍历到某个位置 (i, j) 并且发现它是陆地(1),这意味着它可能是岛屿的一部分。于是你需要调用 DFS 来探索与这个位置相连的所有陆地单元格,以计算这个岛屿的面积。

为什么将访问过的陆地变为0

在每次 DFS 调用中,你会将访问过的陆地标记为水(将 1 变成 0),这样可以避免重复计算已经处理过的岛屿。

其实也可以变为 -1 或者任何不为1的数

当然也可以新建一个列表 visited 记录下来每一个访问过的地方,但是这样会浪费空间

BFS解法

class Solution:
    dir = [(-1,0),(1,0),(0,-1),(0,1)]
    def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
        ans = 0
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                queue = [(i,j)]
                count = 0
                while len(queue) > 0:
                    x,y = queue.pop(0)
                    if  x < 0 or x >= len(grid) or y < 0 or y >= len(grid[0]) or grid[x][y] != 1:
                        continue
                    grid[x][y] = -1
                    count += 1
                    for dx,dy in self.dir:
                        nx,ny = x+dx,y+dy
                        queue.append((nx,ny))
                ans = max(ans,count)
        return ans

为什么将检查放在四个方向循环之后是错误的

如果你把检查逻辑放在四个方向循环之后,代码可能会变成这样:

for dx, dy in self.dir:
    nx, ny = x + dx, y + dy
    # 假设这里再检查是否越界或是否访问过
    if nx < 0 or nx >= len(grid) or ny < 0 or ny >= len(grid[0]) or grid[nx][ny] != 1:
        continue
    queue.append((nx, ny))

这样处理代表在弹出节点 (x, y) 后,你已经默认地将这个节点当作有效节点,甚至可能在 count += 1 之前错误地处理了它。例如第一次添加的节点,你并不知道他是否有效,但你只在这里进行判断就会导致漏掉一个判断。

这里你可以使用控制变量法,将这段代码加入进去发现还是正确的,但是如果去掉while循环下的判断就会发生错误

class Solution:
    dir = [(-1,0),(1,0),(0,-1),(0,1)]
    def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
        ans = 0
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                queue = [(i,j)]
                count = 0
                while len(queue) > 0:
                    x,y = queue.pop(0)
                    if  x < 0 or x >= len(grid) or y < 0 or y >= len(grid[0]) or grid[x][y] != 1:
                        continue
                    grid[x][y] = -1
                    count += 1
                    for dx,dy in self.dir:
                        nx,ny = x+dx,y+dy
                        if nx < 0 or nx >= len(grid) or ny < 0 or ny >= len(grid[0]) or grid[nx][ny] != 1:
                            continue
                        queue.append((nx,ny))
                ans = max(ans,count)
        return ans

标签:gt,最大,面积,岛屿,len,nx,ny,grid,ans
From: https://www.cnblogs.com/xiaofengs/p/18547764

相关文章

  • java计算二个四边形的重贴面积
    判断rect2在rect1上重贴面积publicbooleancalculateAreas(TbCusCameraRecognitionAreasrect1,TbCusCameraRecognitionAreasrect2){if(rect1==null||rect2==null){returntrue;}try{doublep1_x=Do......
  • 深入浅出学算法044-最大整数
    题目描述设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。      例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213      又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613输入输入分2行第一行是n第2行是n个整数输出连接成的多位数......
  • 最大子树和
    题目链接:最大子树和题目描述:小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题。一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题。于是当日课后,小明就向老师提出了这个问题:一株奇怪的花卉,上面共连有\(......
  • 【Azure App Service】在App Service for Windows上验证能占用的内存最大值Y5
    问题描述在创建AppService服务的时候,根据定价层不同,内存使用的最大值也有不同。但在实际测试中,发现内存最大只能占用2GB左右,而定价层中内存分配明明是大于2GB(比如B3定价层的内存为7GB),这是一种什么情况呢?在AppService中Kudu工具上,查看进程分配的内存大小:问题解答使用......
  • 代码随想录算法训练营 | 200.岛屿的数量
    岛屿的数量题目链接:https://leetcode.cn/problems/number-of-islands/此题目要点:dfs和bfs都可以解决此题,但是使用dfs代码会更加的简洁首先对grid进行遍历,每一个节点都进行检查,判断是否是1(陆地)如果是,则进行dfs深搜,并将所有搜到的岛屿节点全置为0,表示此块岛屿已经被搜过了,防......
  • 【Azure App Service】在App Service for Windows上验证能占用的内存最大值
    问题描述在创建AppService服务的时候,根据定价层不同,内存使用的最大值也有不同。但在实际测试中,发现内存最大只能占用2GB左右,而定价层中内存分配明明是大于2GB(比如B3定价层的内存为7GB),这是一种什么情况呢?在AppService中Kudu工具上,查看进程分配的内存大小: 问题解答使......
  • 101 最大公约数
    //101最大公约数.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/21/problem/486输入T,一共T组数据,每组两个数a,b,输出它们的最大公约数和最小公倍数。输入格式第一行一个数字T。接下来T行,每行两个数字a,b。输出格......
  • C小题目:输入10个整数,将其中最小的数与第1个数对换,将最大的数与最后一个对换。要求写3
    题目要求如下:输入10个整数,将其中最小的数与第1个数对换,将最大的数与最后一个对换。要求写3个函数:(1)输入10个数;(2)进行处理;(3)输出10个数。提示:(1)定义voidinput(int*p)函数,用来输入10个整数,存放到指针变量p所指向的数组中;(2)定义voidmax_min_value(int*p)函数,在指针变量p所指......
  • 关于电线平方数(截面积)与功率之间关系的对比表格。该表格主要基于电流承载能力(导线的截
    关于电线平方数(截面积)与功率之间关系的对比表格。该表格主要基于电流承载能力(导线的截面积)与相应的功率传输能力。电线截面积(mm²)额定电流(A)适用功率(W) (220V电压)适用功率(W) (380V电压)0.5mm²5A1100W1900W0.75mm²8A1760W30......
  • 华为OD机试真题-寻找最大价值的矿堆-2024年OD统一考试(E卷)
    最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客     每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。题目描述给你一个由''(空地)......