[LeetCode 最大岛屿面积

news/2024/12/29 11:52:14/文章来源:https://www.cnblogs.com/xiaofengs/p/18547754

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 0grid[x][y] = 0ans = 1for (dx,dy) in self.dir:ans += self.dfs(grid,x+dx,y+dy)return ansdef maxAreaOfIsland(self, grid: List[List[int]]) -> int:ans = 0for 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 = 0for i in range(len(grid)):for j in range(len(grid[0])):queue = [(i,j)]count = 0while 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:continuegrid[x][y] = -1count += 1for dx,dy in self.dir:nx,ny = x+dx,y+dyqueue.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:continuequeue.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 = 0for i in range(len(grid)):for j in range(len(grid[0])):queue = [(i,j)]count = 0while 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:continuegrid[x][y] = -1count += 1for dx,dy in self.dir:nx,ny = x+dx,y+dyif nx < 0 or nx >= len(grid) or ny < 0 or ny >= len(grid[0]) or grid[nx][ny] != 1:continuequeue.append((nx,ny))ans = max(ans,count)return ans

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/833987.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Ubuntu】在Ubuntu上安装微信

【Ubuntu】在Ubuntu上安装微信 零、说明 微信官网最近发布了Linux的测试版本,实际使用下来与Windows版本相差不多,本文介绍如何在Ubuntu(Debian系)上安装Linux版本的微信。 壹、下载 打开Linux微信官网:https://linux.weixin.qq.com/,根据自己的处理器架构选择对应的deb格…

文件共享服务之NFS挂载实验

任务需求 1.部署一台web服务器,提供静态网页的展示,该网站的html等静态资源远程存储在NFS服务器。 2.部署NFS服务器,创建共享文件夹(提供静态文件),发布该共享目录,提供给web服务器使用。 主机列表 # 外网地址 内网地址 主机名 192.168.122.207…

第 5 篇 Scrum 冲刺博客

团队作业4——第 5 篇 Scrum 冲刺博客 作业要求这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13234这个作业的目标 团队集体协作完成项目开发队名 雄狮般的男人站立式…

Sitecore debug 工具

由于 Sitecore 的调试需要老是通过 log 来分析,而每次更新 dll 都需要等待一定的时间和重复执行前端的操作逻辑,特开发一个在线编辑器的方式来方便调试。警告:请勿在生产环境使用。截图构建项目 打开 Frontend,使用 pnpm i 安装依赖包,然后 pnpm build:vite 构建项目,之后…

如何禁止 SQL Server 中的 xp_cmdshell 以提高安全性

概述 在 SQL Server 中,xp_cmdshell 是一个强大的功能,它允许执行操作系统级别的命令。然而,这也带来了潜在的安全风险。本文将详细介绍如何禁止 xp_cmdshell,以增强 SQL Server 的安全性。 禁止 xp_cmdshell 的步骤 步骤 1:检查 xp_cmdshell 的当前状态 在开始禁止 xp_cm…

“亦”真“亦”假?——MXsteerWheel与DYNA4的强强联手

高性能力反馈方向盘MXsteerWheel作为线控转向开发的新帮手,在北汇信息的展台上一直是大家关注的焦点。由于它简练出众的外表与真实阻尼的手感,吸引参展的朋友都乐此不疲地进行尝试。而后又不禁感叹,亦真亦假!图1 桌面式驾驶模拟器 一、系统组成整体来看,驾驶模拟器由CANo…

c++_primer之第四章

4.1 节练习 练习 4.1 在算术运算符中,乘法和除法的优先级相同,且均高于加减法的优先级。因此 上式的计算结果应该是 105,在编程环境中很容易验证这一点。 练习 4.2 在本题涉及的运算符中,优先级最高的是成员选择运算符和函数调用运算符, 其次是解引用运算符,最后是加法运…

Docker Kubernetes

Docker镜像与容器 Docker 中有两个重要概念。 一个是容器(Container):容器特别像一个虚拟机,容器中运行着一个完整的操作系统。可以在容器中装 Nodejs,可以执行npm install,可以做一切你当前操作系统能做的事情 另一个是镜像(Image):镜像是一个文件,它是用来创建容器…

thinkphp升级后报错Declaration of think\app\Url::build() must be compatible with think\route\Url::build():

​ 将源码中的thinkphp升级后,发现了错误:Declaration of think\app\Url::build() must be compatible with think\route\Url::build(): string 出现这个错误的原因是,你通过命令“composer update topthink/framework”只升级了框架,没有更新多应用扩展模块。 只需要compo…

为什么 PHP 在 2024 年会越来越受欢迎:经典语言的意外回归

2024 年,PHP 出人意料地卷土重来,这得益于重大的性能改进、现代功能和蓬勃发展的生态系统。 在 Laravel 等框架的引领和广泛的托管支持下,PHP 已成为强大、快速且可靠的 Web 开发选择,这些证明它远未过时。 二十多年来,PHP 一直是 Web 开发的基石,为数百万个网站和 Web 应…

linux终端美化 oh-my-bash安装

之前一直在用zsh终端,然后安装oh-my-zsh,配置后感觉特别清爽,于是想bash终端下是否存在类似的软件,找了下发现了oh-my-bash。特记录下安装使用过程 oh my bash官网:https://ohmybash.nntoan.com/ oh my bash github:https://github.com/ohmybash/oh-my-bash系统终端SHELL…

MATLAB R2023b for Mac(专业的编程和数学计算软件)v23.2.0.2428915激活版

MATLAB R2023b是MathWorks公司推出的一款专业的数值计算和数据可视化软件,它是MATLAB软件系列的最新版本。该软件在科学、工程和金融等领域的数据分析和模拟方面表现出色,具有强大的功能和工具。MATLAB R2023b引入了更强大的并行计算功能,提高了工作效率,使得用户可以更快地…