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/11 13:47:03

CosyVoice-300M Lite实战:电子书语音合成系统搭建

CosyVoice-300M Lite实战&#xff1a;电子书语音合成系统搭建 1. 引言 1.1 项目背景与业务需求 随着数字阅读的普及&#xff0c;电子书内容消费正从“视觉主导”向“多模态交互”演进。越来越多用户希望在通勤、家务等无法专注阅读的场景下&#xff0c;通过听觉获取信息。传…

作者头像 李华
网站建设 2026/6/13 19:31:58

从本地到实时识别|基于科哥FunASR镜像构建高精度中文ASR服务

从本地到实时识别&#xff5c;基于科哥FunASR镜像构建高精度中文ASR服务 1. 引言&#xff1a;语音识别的工程化落地需求 随着AI技术在语音交互、会议记录、内容创作等场景中的广泛应用&#xff0c;高精度、低延迟的中文语音识别&#xff08;ASR&#xff09;系统已成为开发者和…

作者头像 李华
网站建设 2026/6/11 15:09:34

proteus示波器在基础电学实验中的图解说明

用Proteus示波器“看见”电学实验&#xff1a;从RC充电到运放失真&#xff0c;一图看懂信号世界你有没有过这样的经历&#xff1f;老师讲欧姆定律、电容充放电、谐振频率时&#xff0c;公式写满黑板&#xff0c;听起来头头是道——可一旦让你画个实际波形&#xff0c;脑子里却一…

作者头像 李华
网站建设 2026/6/13 5:39:26

FSMN VAD置信度过滤:低质量片段剔除代码实现

FSMN VAD置信度过滤&#xff1a;低质量片段剔除代码实现 1. 引言 1.1 技术背景与问题提出 FSMN VAD 是阿里达摩院 FunASR 项目中开源的语音活动检测&#xff08;Voice Activity Detection, VAD&#xff09;模型&#xff0c;广泛应用于会议录音、电话对话、音频预处理等场景。…

作者头像 李华
网站建设 2026/6/15 5:32:21

高效图像分割新姿势|sam3大模型镜像集成Gradio,支持自然语言提示

高效图像分割新姿势&#xff5c;sam3大模型镜像集成Gradio&#xff0c;支持自然语言提示 1. 引言 在计算机视觉领域&#xff0c;图像分割作为理解视觉内容的核心任务之一&#xff0c;近年来随着基础模型的发展迎来了重大突破。传统的图像分割方法依赖大量标注数据和特定场景的…

作者头像 李华
网站建设 2026/6/11 15:12:04

提升效率:Vetur驱动的Vue项目标准化搭建

从“手写规范”到“开箱即用”&#xff1a;用 Vetur 打造标准化 Vue 开发环境 你有没有遇到过这样的场景&#xff1f; 新同事刚接手项目&#xff0c;打开一个 .vue 文件——模板缩进错乱、JS 没加分号、CSS 使用了不统一的变量命名……更离谱的是&#xff0c;保存一下代码&…

作者头像 李华