news 2026/6/15 13:54:21

【力扣200. 岛屿数量】的一种错误解法(BFS)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【力扣200. 岛屿数量】的一种错误解法(BFS)

先看正确解法,每个节点1一旦被访问到,就立刻被改为0

classSolution{public:intnumIslands(vector<vector<char>>&grid){intm=grid.size();if(0==m)return0;intn=grid[0].size();if(0==n)return0;intcount=0;for(inti=0;i<m;i++){for(intj=0;j<n;j++){if('0'==grid[i][j])continue;grid[i][j]='0';count++;queue<pair<int,int>>q;// 相邻节点q.push({i,j});while(false==q.empty()){pair<int,int>p=q.front();q.pop();intx=p.first;inty=p.second;if(x-1>=0&&grid[x-1][y]=='1'){q.push({x-1,y});grid[x-1][y]='0';}if(x+1<m&&grid[x+1][y]=='1'){q.push({x+1,y});grid[x+1][y]='0';}if(y-1>=0&&grid[x][y-1]=='1'){q.push({x,y-1});grid[x][y-1]='0';}if(y+1<n&&grid[x][y+1]=='1'){q.push({x,y+1});grid[x][y+1]='0';}}}}returncount;}};

下面的错误解法,在出队后统一将访问的节点值改为0

classSolution{public:intnumIslands(vector<vector<char>>&grid){intm=grid.size();if(0==m)return0;intn=grid[0].size();if(0==n)return0;intcount=0;for(inti=0;i<m;i++){for(intj=0;j<n;j++){if('0'==grid[i][j])continue;// grid[i][j] = '0';count++;queue<pair<int,int>>q;// 相邻节点q.push({i,j});while(false==q.empty()){pair<int,int>p=q.front();q.pop();intx=p.first;inty=p.second;grid[x][y]='0';if(x-1>=0&&grid[x-1][y]=='1'){q.push({x-1,y});// grid[x - 1][y] = '0';}if(x+1<m&&grid[x+1][y]=='1'){q.push({x+1,y});// grid[x + 1][y] = '0';}if(y-1>=0&&grid[x][y-1]=='1'){q.push({x,y-1});// grid[x][y - 1] = '0';}if(y+1<n&&grid[x][y+1]=='1'){q.push({x,y+1});// grid[x][y + 1] = '0';}}}}returncount;}};

这种错误做法有一个逻辑问题没有立即标记访问过的节点,这会导致重复入队和无限循环

问题分析

在将节点加入队列时不立即标记为已访问,会发生以下情况:

// 错误示例if(x-1>=0&&grid[x-1][y]=='1'){q.push({x-1,y});// 这里push了(x-1, y)// 没有立即标记为'0',这个节点还是'1'}

具体问题

假设有这样的岛屿:

1 1 1 1

执行流程:

  1. 遇到(0,0),入队(0,0)
  2. 弹出(0,0),访问它的四个方向
  3. 发现(0,1)1,入队(0,1)← 入队时没有标记
  4. 发现(1,0)1,入队(1,0)← 入队时没有标记
  5. 弹出(0,1),访问四个方向
  6. 发现(0,0)已经是0,没问题
  7. 发现(1,1)1,入队(1,1)
  8. 弹出(1,0),访问四个方向
  9. 发现(0,0)已经是0
  10. 发现(1,1)1问题在这里!

由于之前(1,1)已经被发现但还没有被标记为0,当从(1,0)访问(1,1)时,又会入队一次(1,1),导致重复入队

更严重的问题

考虑更大的岛屿,这种重复入队会导致队列中包含大量重复节点,可能导致:

  1. 队列过大
  2. 处理时间增加
  3. 在极端情况下可能导致无限循环或性能问题

正确做法

在节点入队时立即标记为已访问,这样:

  1. 保证每个节点只入队一次
  2. 避免重复访问
  3. 逻辑更清晰,符合BFS的原则
// 正确做法:入队时立即标记if(x-1>=0&&grid[x-1][y]=='1'){q.push({x-1,y});grid[x-1][y]='0';// 立即标记}

或者也可以在弹出节点时标记,但这样需要在入队时检查是否已访问,而上述错误代码只在入队时检查grid[x - 1][y] == '1',没有检查是否已经在队列中但还未被处理。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 16:18:46

小参数大作为:VibeThinker-1.5B在算法竞赛中的实战表现

小参数大作为&#xff1a;VibeThinker-1.5B在算法竞赛中的实战表现 获取更多AI镜像 想探索更多AI镜像和应用场景&#xff1f;访问 CSDN星图镜像广场&#xff0c;提供丰富的预置镜像&#xff0c;覆盖大模型推理、图像生成、视频生成、模型微调等多个领域&#xff0c;支持一键部署…

作者头像 李华
网站建设 2026/6/13 6:15:22

AI智能办公实战:用UI-TARS-desktop快速实现自动化任务

AI智能办公实战&#xff1a;用UI-TARS-desktop快速实现自动化任务 1. 引言&#xff1a;智能办公自动化的新范式 随着大模型技术的快速发展&#xff0c;AI代理&#xff08;AI Agent&#xff09;正逐步从理论探索走向实际应用。在办公场景中&#xff0c;重复性高、规则明确的任…

作者头像 李华
网站建设 2026/6/13 4:17:20

Linux-MySQL日志管理

1.日志概述1.1什么是MySQL日志MySQL 日志用于记录数据库运行期间各种行为动作&#xff08;DDL,DML,DQL,DCL&#xff09;。可以是文件、文本等存储形式。记录了 MySQL 从启动、运行到结束的整个生命周期中的关键行为。1.2MySQL日志的作用MySQL日志作用1.故障排查帮助诊断数据库运…

作者头像 李华
网站建设 2026/6/15 14:05:52

没显卡怎么跑bert-base-chinese?云端GPU 5分钟部署,1块起步

没显卡怎么跑bert-base-chinese&#xff1f;云端GPU 5分钟部署&#xff0c;1块起步 你是不是也遇到过这种情况&#xff1a;作为一名前端开发者&#xff0c;想在项目里加个中文文本分类功能&#xff0c;比如自动识别用户评论是好评还是差评。你查了一圈&#xff0c;发现最靠谱的…

作者头像 李华
网站建设 2026/6/15 16:14:15

一文说清PCAN在Windows中的API调用方法

一文说清PCAN在Windows中的API调用方法 从一个“收不到数据”的坑说起 你有没有遇到过这种情况&#xff1a; 代码写得严丝合缝&#xff0c;设备也插上了&#xff0c;驱动看着正常&#xff0c;可就是 收不到任何CAN帧 &#xff1f;调试半天才发现&#xff0c;原来是波特率设…

作者头像 李华
网站建设 2026/6/13 1:07:21

中文BERT填空模型优化:推理速度提升方案

中文BERT填空模型优化&#xff1a;推理速度提升方案 1. 引言 1.1 BERT 智能语义填空服务的工程挑战 随着自然语言处理技术的发展&#xff0c;基于预训练语言模型的语义理解应用逐渐走向落地。其中&#xff0c;中文 BERT 模型因其强大的上下文建模能力&#xff0c;在成语补全…

作者头像 李华