广度优先搜索(BFS)的一个(重要!)细节(可能因此卡题)

bfs广度优先搜索 最小生成树算法分层。 阅读详情

引言:

为了一个广度优先搜索的细节有必要水一整篇文章?有必要。

这个细节非常重要,以至于我在切Leetcode某一题的时候,明明和答案的高效率通过的代码相差无几,逻辑毫无错误,STL使用相同,但仍然有几个测试点卡不过去。

题目来源:200.岛屿数量


我原来的代码:

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
       // vector<vector<bool>> visited(grid.size(),vector<bool>(grid[0].size(),false));
        //int dx[4] = {1,0,-1,0};
        //int dy[4] ={0,-1,0,1};
        int res = 0;
        int r= grid.size();
        int c = grid[0].size();
        for(int i = 0;i<r;++i){
            for(int j  =0;j<c;++j){
                if(grid[i][j] == '0')continue;
                queue<pair<int,int>> q;
                q.push({i,j});
                res ++;
                grid[i][j] = '1';
                while(!q.empty()){
                    int x = q.front().first;
                    int y = q.front().second;
                    q.pop();
                    grid[x][y] = '0';
                    /*
                    for(int k = 0;k<4;++k){
                        int xx = x+dx[k];
                        int yy = y+dy[k];
                        if(xx<0||xx>=grid.size() ||yy<0||yy>=grid[0].size()||grid[xx][yy]=='0'){
                            continue;
                        }
                        q.push(make_pair(xx,yy));
                    }*/
                    if(x-1>=0 && grid[x-1][y]=='1')q.push({x-1,y});
                    if(y-1>=0 &&grid[x][y-1]=='1')q.push({x,y-1});
                    if(x+1<r&&grid[x+1][y]=='1')q.push({x+1,y});
                    if(y+1<c&&grid[x][y+1]=='1')q.push({x,y+1});
                }
            }
        }
        return res;
    }
};

代码运行后,总是超时。

我做了许多猜测与尝试,排除了  另外开visited数组、make_pair、dx[]与dy[]、甚至访问vector的size()等可能导致超时的因素。

但是都没有太大的效果。

于是排除所有可能,真相就只有一个了——

先来看看答案代码:

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        int nr = grid.size();
        if (!nr) return 0;
        int nc = grid[0].size();

        int num_islands = 0;
        for (int r = 0; r < nr; ++r) {
            for (int c = 0; c < nc; ++c) {
                if (grid[r][c] == '1') {
                    ++num_islands;
                    grid[r][c] = '0';
                    queue<pair<int, int>> neighbors;
                    neighbors.push({r, c});
                    while (!neighbors.empty()) {
                        auto rc = neighbors.front();
                        neighbors.pop();
                        int row = rc.first, col = rc.second;
                        if (row - 1 >= 0 && grid[row-1][col] == '1') {
                            neighbors.push({row-1, col});
                            grid[row-1][col] = '0';
                        }
                        if (row + 1 < nr && grid[row+1][col] == '1') {
                            neighbors.push({row+1, col});
                            grid[row+1][col] = '0';
                        }
                        if (col - 1 >= 0 && grid[row][col-1] == '1') {
                            neighbors.push({row, col-1});
                            grid[row][col-1] = '0';
                        }
                        if (col + 1 < nc && grid[row][col+1] == '1') {
                            neighbors.push({row, col+1});
                            grid[row][col+1] = '0';
                        }
                    }
                }
            }
        }

        return num_islands;
    }
};
作者:LeetCode
链接:https://leetcode-cn.com/problems/number-of-islands/solution/dao-yu-shu-liang-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

对比可以发现,答案与我的代码里面一个看似没什么影响的差别在于:

我的代码是从队列中弹出节点时才把这个节点标记为<已访问>,而答案代码里是在push进队列的时候就标记其为<未访问>。

看似没有什么逻辑问题啊。

但是,

我仔细

仔细

想了想。

这实际上导致的效率差别是巨大的!

比如,在访问cur节点的时候,把一个B节点push了进队列(也就是说B节点是cur节点的邻居节点),

如果我此刻没有标记其为<已访问>的话,

那么我在访问队列中排在B前面的节点cur2时(即在cur之后,B之前,被push进队列的节点),

如果我在cur2的邻居节点里看到了B,此刻由于B还没有出队列,所以它目前未被标记为<已访问>

那么,此时B又会再一次被push进队列里面!!!

也就是说,一个节点会被访问多次,那运行时间固然就翻倍了。

由此可见这个细节的重要性之大。

(如果比赛的时候因为这个细节卡题了的话,我想我就不会痛失倒一了吧。)

da93cea3-066d-4e83-a1c4-ab7c1417c276
BFS算法(广度优先搜索)java BFS介绍 BFS:宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。 BFS 的核心思想就是把一些问题抽象成图,从一个点开始,向四周开始扩散。一般来说,我们写 BFS 算法都是用「队列」这种数据结构,每次将一个节点周围的所有节点加入队列。 BFS 出现的常见场景,问题的本质就是让你在一幅「图」中找到从起点start到终点target的最近距离。 嘛意思呢,假设你 阅读详情

相关推荐

广度优先搜索(BFS)(算法笔记)

深度优先搜索是一种枚举所有完整路径以遍历所有情况的搜索方法,总是以“广度”作为前进的关键词,采用队列实现。广度优先搜索属于搜索问题的一种,当问题可以被描述为“路径搜索”时,就可以采用搜素问题的所有解的方式来进行解决,所以BFS本质还是暴力。广搜也存在“岔道口”,只是当遇到“岔道口”时,需要将本层所有的岔道都走一遍,然后再走下一层的岔道,符合队列的“先进先出”思想。广搜和深搜的共同点之一是只有一个起点,也就是说一次搜索只能遍历以一个点为起点的所有路径。而BFS更适合需要搜索最优解的问题,

Arabot_的博客 3027

我的算法不可能这么简单—广度优先搜索BFS

文章目录

终曲 9936

人工智能的广度优先搜索 (BFS)

广度优先搜索是一种无知搜索方法,因此我们示例的机器人不使用任何关于我们的机器人从其初始状态行进了多远的信息,也没有使用机器人离目标有多远的信息。正如我们之前看到的,BFS 算法从初始状态开始,然后以广度优先的方式访问相邻状态,直到找到目标状态或探索所有可到达的状态。另一方面,DFS 基于堆栈数据结构,与 BFS 类似,它也从根节点开始,但它会尽可能地遍历节点,直到到达没有未访问的相邻节点。最初,它从根节点开始,然后扩展所有后继节点,在移动到下一级别的节点之前,它系统地探索所有相邻节点。

jianqimingtian的博客 1395

[C++]广度优先搜索(BFS)(附例题)

广度优先搜索(BFS)(附例题)问题产生:Isenbaev是国外的一个大牛。现在有许多人要参加ACM ICPC。一共有n个组,每组3个人。同组的3个人都是队友。大家都想知道自己与大牛的最小距离是多少。大牛与自己的最小距离当然是0。大牛的队友和大牛的最小距离是1。大牛的队友的队友和大牛的最小距离是2……以此类推。如果实在和大牛没有关系的只好输出undefined了。第一行读入n。表示有n个组。1 ≤

stary_yan的博客 3万+

STC15W204S最小系统开发指南:从串口通讯到自动热加载全流程

本文详细介绍了STC15W204S最小系统的完整开发流程。从芯片资源解析、最小系统搭建、串口通讯驱动编写(使用Timer2生成波特率),到实现基于魔术值触发的自动热加载功能,并最终集成Keil与STC-ISP软件,构建高效的自动化开发工作流,显著提升嵌入式调试效率。

a1b2c的博客 391

【域控制器EMC】域控制器EMC设计总结

汇总项目设计当中关于EMC的设计要点,主要从原理设计、Layout、结构、外设部分总结。满足要求的器件和合理的电路能降低电磁干扰;正确的布局、接地、信号路径、屏蔽等可以减少电磁辐射。结构件设计也会对EMC性能产生影响。

weixin_42098658的博客 1259

Leetcode刷题笔记——广度优先搜索(BFS)

本文给大家介绍了广度优先搜索算法,以及相关的题型,相较于DFSBFS要简单一些,树的BFS和图的BFS有比较大的区别,其中的图的BFS中需要注意源点时单源BFS还是多源BFS,本文的介绍就到这里~

qq_42898642的博客 1278

MS1030超声波流量计电路实战:如何用15ps精度优化水表设计(附配置代码)

本文深入探讨了如何利用MS1030超声波流量计芯片实现15ps高精度测量,以优化水表设计。文章从系统误差分配出发,详细解析了硬件电路设计要点、SPI通信配置及核心优化技巧,如利用可编程偏置电压和8回波累加功能来提升抗干扰能力与测量稳定性,并附有实用的配置代码示例。

svm4gardener的博客 333

广度优先搜索(BFS)+回溯解决LeetCode 126题:单词接龙 II

多种算法实现 单词接龙

10年数据\经营分析经验,现任大厂数据分析负责人 2176

SAP物料分类账(ML)避坑指南:激活顺序错了怎么办?从CKMSTART到差异分摊的完整流程

本文详细解析SAP物料分类账(ML)的正确激活顺序与配置流程,帮助用户避免常见陷阱如'LKW无科目'、'在制品重估失败'等问题。从CKMSTART到差异分摊的完整流程,涵盖关键配置节点、典型报错分析与应急处理方案,确保产品成本控制(CO-PC)模块的顺利运行。

weixin_42524708的博客 258

大模型系列——Ollama简明教程

在这篇文章中,我们将了解如何使用 Ollama、如何在 Ollama 中创建自己的模型 以及如何使用 Ollama 构建聊天机器人。这是深入研究 Ollama 的第一部分,以及我所学到的有关本地 LLM 的知识以及如何将它们用于基于推理的应用程序。在这篇文章中,你将了解——

2401_84052244的博客 1万+

【AcWing刷题】蓝桥杯专题突破-广度优先搜索-bfs(11)

844. 走迷宫

Locky136的博客 1423

【目标检测】基于yolov5的安全帽佩戴检测系统(附代码和数据集)

【目标检测】基于yolov5的安全帽佩戴检测系统(附代码和数据集)

学无止境、积少成多、厚积薄发 3106

【算法】BFS—广度优先搜索

【算法】BFS—广度优先搜索     1.BFS介绍     2.连通图     3.BFS算法流程图     4.实例:poj3984迷宫问题     5.核心代码参考:《算法导论》【算法入门】广度/宽度优先搜索(BFS) https://blog.csdn.net/raphealguo/article/details/7523411广度优先搜索算法 https://blog.csdn.net/...

gogo小Sa的专栏 2232

人工智能数据治理——解读AI时代数据治理白皮书 2025【附全文阅读】

摘要:该白皮书面向企业数字化负责人及AI项目推进人员,探讨AI时代数据治理的战略升级。提出"好数据+好数据知识"双基石理念,强调数据需满足"三高"标准(高精度、一致性、时效性)并构建语义知识库。构建四层治理框架,包括数据采集处理、合规安全、知识库建设及质量改进,并介绍AI赋能治理的新范式,如智能ETL和治理Agent体系。同时分析"软件+AI+好数据"的应用模式,为企业实现智能数据治理提供实践指导。(149字)

cdfunlove的博客 633

Open3D 球旋转算法(BPA)三维建模【2026最新版】

球旋转算法,博客长期更新,本文最新更新时间为:2026年4月11日。

点云侠的博客 37万+

BFS广度优先搜索

一、BFS的概念{BFS的定义 BFS的搜索方式 BFS的特点} 二、BFS的实战应用{1.走迷宫[代码实现 扩展] 2.升级版走迷宫(边的权值不同)[思路 代码实现 扩展] 3.八数码[代码实现]}

咸鱼势力登场 4048

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

BFS 广度优先搜索 解析

1.概念:        广度优先搜索算法(Breadth-First-Search),又译作宽度优先搜索,或横向优先搜索,简称BFS,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。广度优先搜索的实现一般采用open-closed表。 2.解析:          如果说DFS(深度优先搜索)靠的是栈,那BFS(广度优先搜索)

colorfulshark 4007

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

广度优先搜索(BFS)

/ 定义图的边结构// 与边相连的另一顶点的索引Edge* next;// 指向下一条邻接边的指针} Edge;// 定义图的顶点结构// 顶点数据// 指向第一个邻接边的指针} Vertex;// 定义图的邻接表结构// 图中顶点的数量// 存储顶点的数组} Graph;

m0_68805093的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【蓝桥杯Java组】刷了这五道题不信你还不会BFS(广度优先搜索)

Java语言的BFS广度优先搜索模板+练习题,看了这五道题,不信你还学不会BFS。

Keep coding! 3427

[python]广度优先搜索算法BFS

leetcode 994. 腐烂的橘子 在给定的网格中,每个单元格可以有以下三个值之一: 值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂的橘子。 每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。 返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。 示例 1: 输入:[[2,1,1],[1,1,0],[0,1,1]] 输出:4 示例 2: 输入:[[2,1,1],[0,1,1],[1,0,1]] 输出:-1 解释:左下角的橘子(第 2

我是天才很好 2315

BFS 广度优先搜索算法

BFS(广度优先搜索)是一种基于队列的图遍历算法,适用于无权图的最短路径查找。其核心机制是逐层扩展节点,保证找到最短路径。时间复杂度O(N),空间复杂度O(N)。文章通过迷宫寻路问题展示了BFS的具体实现:初始化标记数组和方向向量,使用队列处理节点,通过回溯前驱节点输出完整路径。代码示例包含地图初始化、BFS核心逻辑和路径回溯功能,并演示了如何解决4x4迷宫问题。此外还介绍了BFS的优化方法(如双向BFS)和变种(如A*算法),并拓展到CTF逆向题中的应用场景。

weixin_55010563的博客 1056

广度优先搜索(BFS)详解

广度优先搜索(BFS)是一种用于图形数据结构的遍历算法,它从给定的起始顶点开始,以广度优先的方式逐层搜索图中的节点,直到找到目标节点或遍历完整个图。BFS算法通常使用队列数据结构来实现,它的时间复杂度为O(V+E),其中V表示图中顶点数,E表示边数。BFS算法在求解最短路径、连通性、拓扑排序等问题中具有重要应用。广度优先搜索(Breadth First Search),简称广搜(BFS)。广搜是逐层扩展状态的搜索策略,常用于解决连通性问题和最短路问题。

m0_69596371的博客 6107

广度优先搜索BFS(洛谷官方)

本文介绍了广度优先搜索(BFS)算法在洛谷题目中的应用,包含三个典型例题解析:马的遍历(P1443)、奇怪的电梯(P1135)和流星雨(P2895)。文章对比了BFS与DFS的适用场景,强调了BFS在求解最短路径问题中的优势,详细讲解了各题的解题思路、代码实现要点和复杂度分析。其中马的遍历展示了二维网格中的BFS应用,奇怪的电梯演示了一维状态转移,流星雨则处理了动态障碍条件下的路径搜索。每道题都提供了标准BFS模板的变体实现,并指出关键细节如访问标记、边界判断和提前终止条件等。

Runa880420的博客 1602

bfs广度优先搜索算法_C语言中的广度优先搜索(BFS)程序

bfs广度优先搜索算法In this tutorial we will discuss about Breadth First Search or BFS program in C with algorithm and an example. Before jumping to actual coding lets discuss something about Graph and BFS. 在...

culing2941的博客 1739
上一篇: 《数据结构》树和二叉树代码整理(C语言实现)
下一篇: LeetCode刷题中出现的奇怪的错误及解决办法
咖啡咖_CoffCa
博客等级 码龄6年 116粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖啡咖_CoffCa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值