news 2026/3/5 4:45:21

代码随想录 200.岛屿数量

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
代码随想录 200.岛屿数量

思路:

(1)题目中每座岛屿只能由水平方向和竖直方向上相邻的陆地连接而成,也就是说斜角度的连接不算。例如示例二,是三个岛屿。

(2)本题的思路是遇到一个没有遍历过的节点陆地,计数器就加1,然后把该节点陆地所能遍历到的陆地都标记上。在遇到标记过的陆地节点和海洋节点的时候直接跳过,这样计数器就是最终岛屿的数量。

(3)把节点陆地所能遍历到的陆地都标记上,就可以使用DFS、BFS或并查集。

一、DFS:

1.目标是找到矩阵中“岛屿的数量”,上下左右相连的1都被认为是连续岛屿。

2.dfs方法:设目前指针指向一个岛屿中的某一个点(i,j),寻找包括此点的岛屿边界。

(1)从(i,j)向此点的上下左右(i + 1,j)、(i - 1,j)、(i,j + 1)、(i、j - 1)做深度搜索。

(2)终止条件:

——(i,j)越过矩阵边界。

——grid[i][j] = 0,表示此分支已越过岛屿边界。

(3)搜索岛屿的同时,执行grid[i][j] = '0',即将岛屿的所有节点删除,以免之后重复搜索相同的岛屿。

3.主循环:遍历整个矩阵,当遇到grid[i][j] = '1'的时候,从此点开始做深度优先搜索dfs,岛屿数count + 1且在深度优先搜索中删除此岛屿。

4.最终返回岛屿数count即可。

附代码:

class Solution { public int numIslands(char[][] grid) { int count = 0; for(int i = 0;i < grid.length;i++){ for(int j = 0;j < grid[0].length;j++){ if(grid[i][j] == '1'){ //发现新岛屿 dfs(grid,i,j); //将整个岛屿标记为已访问(沉没整个岛屿) count++; //岛屿数量 + 1 } } } return count; } private void dfs(char[][] grid,int i,int j){ //递归终止条件(边界检查 + 遇到水/已访问的陆地) // ||操作具有短路特性,只要前面的任何一个条件为true,后面的条件就不会执行 //因此要先做边界检查,当边界检查都通过后再判断grid[i][j] // &&也有短路特性 if(i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] == '0'){ return; } //将当前陆地标记为已访问(沉没岛屿,改为‘0’) grid[i][j] = '0'; //向四个方向递归探索 dfs(grid,i + 1,j); //下 dfs(grid,i,j + 1); //右 dfs(grid,i - 1,j); //上 dfs(grid,i,j - 1); //左 } }

二、BFS:

1.主循环和DFS类似,不同点在于搜索某岛屿边界的方法不同。

2.BFS方法:

(1)借用一个队列queue,判断队列首部节点(i,j)是否未越界且为‘1’。

——若是,则置0(删除岛屿节点),并将此节点的上下左右节点(i + 1,j)、(i - 1,j)、(i,j + 1)、(i,j - 1)加入队列。

——若不是,则跳过此节点。

(2)remove(pop)队列的首节点,直到整个队列为空,此时已经遍历完此岛屿。

附代码:

class Solution { public int numIslands(char[][] grid) { int count = 0; for(int i = 0; i < grid.length; i++) { for(int j = 0; j < grid[0].length; j++) { if(grid[i][j] == '1'){ //发现新岛屿 bfs(grid, i, j); //将整个岛屿标记为已访问(沉没整个岛屿) count++; //岛屿计数 + 1 } } } return count; } private void bfs(char[][] grid, int i, int j){ LinkedList<int[]> queue = new LinkedList<>(); //BFS队列 queue.add(new int[] { i, j }); //将起始点加入队列 while(!queue.isEmpty()){ int[] cur = queue.remove(); //取出队首节点 i = cur[0]; j = cur[1]; //检查节点是否有效且是陆地 if(0 <= i && i < grid.length && 0 <= j && j < grid[0].length && grid[i][j] == '1') { grid[i][j] = '0'; //标记为已访问(改为水) //将四个方向的相邻节点加入到队列 queue.add(new int[] { i + 1, j }); queue.add(new int[] { i - 1, j }); queue.add(new int[] { i, j + 1 }); queue.add(new int[] { i, j - 1 }); } } } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/3 14:35:22

FossFLOW容器化部署实战:从零到一的等距图可视化平台搭建指南

FossFLOW容器化部署实战&#xff1a;从零到一的等距图可视化平台搭建指南 【免费下载链接】OpenFLOW 项目地址: https://gitcode.com/gh_mirrors/openflow1/OpenFLOW 你是否曾经为了部署一个可视化工具而头疼不已&#xff1f;配置环境、依赖冲突、数据丢失……这些痛点…

作者头像 李华
网站建设 2026/3/3 14:35:23

Vue-cli如何集成百度开源上传组件实现分片上传?

中石油旗下子公司大文件传输系统技术方案 一、项目背景与需求分析 作为中石油集团旗下专注于能源信息化领域的子公司&#xff0c;我司长期服务于政府及军工单位&#xff0c;在能源管理、安全生产等关键领域积累了丰富的行业经验。本次政府招投标项目提出的大文件传输需求具有…

作者头像 李华
网站建设 2026/3/3 14:35:30

TinyMCE5处理政府公文图片水印保留

企业网站后台Word粘贴与导入功能开发方案 方案概述 大家好&#xff0c;我是重庆某软件公司的ASP.NET前端工程师&#xff0c;最近接到了一个企业网站后台管理系统的增强需求&#xff0c;需要在TinyMCE编辑器中增加Word粘贴功能和多格式文档导入功能。经过一番研究和评估&#…

作者头像 李华
网站建设 2026/3/3 23:24:52

wangEditor处理ppt幻灯片图文混排转存站群

Word粘贴与导入功能集成方案评估与实施记录 一、需求分析与技术调研 作为江西某软件公司的前端工程师&#xff0c;我最近接到了在企业网站后台管理系统中集成Word粘贴和文档导入功能的需求。经过与客户的详细沟通&#xff0c;我梳理了以下核心需求点&#xff1a; Word粘贴功…

作者头像 李华
网站建设 2026/3/4 20:24:37

HunyuanVideo 1.5技术突破:83亿参数模型如何重塑视频内容产业链

腾讯混元团队最新开源的HunyuanVideo 1.5以83亿参数的轻量化架构实现专业级视频生成能力&#xff0c;在消费级GPU上完成720P视频创作&#xff0c;为中小企业提供了低门槛AI视频生成解决方案。该模型采用创新的SSTA稀疏注意力机制和3D VAE压缩技术&#xff0c;显存需求从60GB降至…

作者头像 李华
网站建设 2026/3/5 0:03:16

TinyMCE4支持跨平台excel数据绑定

没有任何限制的在任何产品中使用&#xff0c;完全开放产品源代码。 今儿一早&#xff0c;又有位网友“神通广大”地加了我微信&#xff0c;说是想探探这块技术的底儿&#xff0c;聊聊解决方案。原来&#xff0c;这位老兄也撞上了在富文本编辑器里粘贴Word图片自动上传的“小怪…

作者头像 李华