news 2026/5/1 7:10:56

【力扣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/23 14:21:15

Youtu-2B自动回复系统:邮件处理部署实战

Youtu-2B自动回复系统&#xff1a;邮件处理部署实战 1. 引言 在企业级服务场景中&#xff0c;自动化响应用户请求是提升运营效率的关键环节。尤其在客户支持、产品咨询和内部协作等场景下&#xff0c;大量重复性邮件消耗了大量人力资源。为解决这一问题&#xff0c;基于大语言…

作者头像 李华
网站建设 2026/4/15 9:41:56

低成本语义搜索方案:Qwen3-4B在消费级显卡上的表现

低成本语义搜索方案&#xff1a;Qwen3-4B在消费级显卡上的表现 1. Qwen3-Embedding-4B 模型核心特性解析 1.1 中等体量下的高效向量化能力 Qwen3-Embedding-4B 是阿里通义千问 Qwen3 系列中专为文本向量化设计的双塔模型&#xff0c;参数规模为 40 亿&#xff08;4B&#xf…

作者头像 李华
网站建设 2026/5/1 6:20:03

GPEN图像修复前后对比:低质量图片增强效果直观展示

GPEN图像修复前后对比&#xff1a;低质量图片增强效果直观展示 1. 引言 在数字图像处理领域&#xff0c;老旧照片、低分辨率截图或因拍摄条件限制导致的模糊、噪点多的肖像图片普遍存在。如何高效、高质量地恢复这些图像的视觉表现力&#xff0c;成为用户和开发者共同关注的问…

作者头像 李华
网站建设 2026/5/1 3:31:01

GPT-OSS-20B-WEBUI教程:实现多模态输入的文本生成

GPT-OSS-20B-WEBUI教程&#xff1a;实现多模态输入的文本生成 1. 引言 1.1 多模态文本生成的技术背景 随着大模型技术的快速发展&#xff0c;多模态输入已成为提升语言模型交互能力的重要方向。传统文本生成模型仅支持纯文本输入&#xff0c;难以满足图像、语音、代码等复合…

作者头像 李华
网站建设 2026/4/24 12:10:36

Qwen3-4B数学能力评测:MATH数据集部署测试步骤

Qwen3-4B数学能力评测&#xff1a;MATH数据集部署测试步骤 1. 引言 随着大语言模型在推理、编程和数学等复杂任务中的广泛应用&#xff0c;对模型实际能力的系统性评估变得尤为重要。Qwen3系列模型作为通义千问的最新迭代版本&#xff0c;在通用能力和多任务表现上实现了显著…

作者头像 李华
网站建设 2026/4/30 23:53:38

BGE-M3性能优化指南:检索速度提升秘籍

BGE-M3性能优化指南&#xff1a;检索速度提升秘籍 1. 引言 在现代信息检索系统中&#xff0c;文本嵌入&#xff08;embedding&#xff09;模型的性能直接影响搜索响应速度和用户体验。BGE-M3 作为一款三模态混合检索模型&#xff0c;支持密集向量&#xff08;Dense&#xff0…

作者头像 李华