news 2026/4/16 18:27:28

【力扣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/4/16 11:15:22

角色分配怎么做?VibeVoice结构化文本示例

角色分配怎么做&#xff1f;VibeVoice结构化文本示例 1. 引言&#xff1a;多说话人语音合成的现实挑战 在播客、有声书和虚拟角色对话日益普及的今天&#xff0c;用户对AI语音生成的需求早已超越“朗读文本”的初级阶段。真实的人类交流是动态的、富有情感且涉及多个角色轮替…

作者头像 李华
网站建设 2026/4/16 13:05:10

通俗解释Windows区域设置对Keil5的影响

一个设置搞乱Keil5中文&#xff1f;揭秘Windows区域与编码的“隐性战争”你有没有遇到过这样的场景&#xff1a;刚接手同事的嵌入式项目&#xff0c;在Keil5里打开.c文件&#xff0c;结果注释全变成一堆像“”、“”的鬼画符&#xff1f;第一反应可能是“文件损坏了”&#xff…

作者头像 李华
网站建设 2026/4/16 12:51:50

GPEN图片修复快速上手:5分钟完成第一张人像增强案例

GPEN图片修复快速上手&#xff1a;5分钟完成第一张人像增强案例 1. 引言 1.1 肖像增强技术的应用背景 在数字图像处理领域&#xff0c;老旧照片修复、低质量人像优化以及社交媒体内容美化已成为高频需求。传统图像增强方法依赖于滤波器和色彩调整&#xff0c;难以实现面部结…

作者头像 李华
网站建设 2026/4/16 11:09:32

手把手实现UDS 19服务故障码提取流程

手把手教你实现UDS 19服务&#xff1a;从零提取汽车故障码 你有没有遇到过这样的场景&#xff1f;车辆仪表盘突然亮起“发动机故障灯”&#xff0c;维修师傅接上诊断仪几秒后就告诉你&#xff1a;“是P0171&#xff0c;混合气过稀。”——这背后到底发生了什么&#xff1f; 答…

作者头像 李华
网站建设 2026/4/16 11:03:38

极简操作:一条命令启动Qwen2.5-7B LoRA训练

极简操作&#xff1a;一条命令启动Qwen2.5-7B LoRA训练 1. 引言 在大模型时代&#xff0c;微调&#xff08;Fine-tuning&#xff09;已成为定制化AI能力的核心手段。然而&#xff0c;传统全参数微调对算力要求极高&#xff0c;难以在单卡环境下运行。LoRA&#xff08;Low-Ran…

作者头像 李华
网站建设 2026/4/16 12:44:00

麦橘超然Flux支持哪些参数?seed和steps怎么调?

麦橘超然Flux支持哪些参数&#xff1f;seed和steps怎么调&#xff1f; 1. 引言&#xff1a;理解麦橘超然Flux的核心控制参数 在使用“麦橘超然 - Flux 离线图像生成控制台”进行AI绘画时&#xff0c;用户最常关注的两个核心参数是 seed&#xff08;随机种子&#xff09; 和 s…

作者头像 李华