Leetcode200. 岛屿数量C++详解

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

力扣200. 岛屿数量

一、题目解析:

    这是一个非常经典的迷宫图上的联通分量的题目。什么是连通分量:就是说一个点通过上下左右连成一片。

   本题的最终问题为:求解陆地这个联通分量的数量,因此外面只需要把所有的连通分量找出来即可。

   如何求解联通分量的数目?

   我们可以用搜索法来求解。从一个点开始找到和这个点相连的所有的点作为一个联通分量,这很明显就是DFS和BFS的应用。如何判断有多少个来联通分量呢?我们可以设置一个外层的for循环来进行遍历,假设连通分量的初始数目为0,如果这个点之前没有访问过,就给联通分量的数目加1,然后就从这个点开始进行DFS搜索,找到这个点的所有连接点作为一个连通分量;如果这个点之前访问过,我们就不给联通分量数目加1。直到找到新的没有访问过的点,然后才给这个数目加1,然后继续从这个点开始进行DFS搜索。

   空间问题:我们可以设置一个额外的数组来记录某个点是否被访问过,但是我们可以进行空间优化:因为已经访问过的点对我们没有任何意义了,所以我们可以直接把它设为0,也就是水。

   一个思维误区:

     之前我的想法是找到所有的联通分量之后,然后再去判断这个联通分量是否满足四周被水包围的条件。但是这个其实是完全没有必要的,因为我们在找连通分量的过程中,只有符合要求(没有越界或者该邻接点为水)的才会被加入到这个连通分量的块中,如果不符合要求,就返回了。所以没有必要去加这一步。如图,其实这个题就是求连通分量的总个数而已。

 

二、算法代码

class Solution {

public:

    int n,m;

    int count=0;

LeetCode 200. 岛屿数量(C++) 思路:我们从题目中可以得知,孤立的岛屿旁边全是海,假设岛屿范围内每一个‘1’是岛屿的一部分,那么我们从岛屿的任意一部分登岛,走遍岛屿的每一块土地,就能确定岛屿的大小和范围。为了找遍所有的岛屿,我们还需要把走过的土地都标记为0,防止从同一岛屿的另一部分登岛。记录岛屿数量加1,再继续找还没有'1'的部分,走遍下一个岛屿。比如下面的例子,不同颜色的'1'表示不同岛屿的一部分。对于这道题来说,广度优先遍历值得注意的地方在于,要先把当前出队的元素上下左右置0(若有岛屿部分),然后再把那些置过0的元素入队。 阅读详情

相关推荐

Leetcode 200. 岛屿数量 解题思路及C++实现

解题思路: 典型的深度优先搜索问题,跟第130题被围绕的区域 有点像,只不过这里不仅要找出被水包围的岛屿,还要计算这些岛屿的总数。 使用深度优先搜索的方法,大循环是遍历整个grid数组(两个for循环)。通过与grid数组相同纬度的数组visited来标记访问过的岛屿位置。循环内的那个if条件执行的逻辑是:当遇到岛屿块‘1’时,通过visited数组,将与其相连的岛屿块都置为1,然后res+...

PaniniGu的博客 1202

c++计算岛屿数量

C++ 中,计算岛屿数量是一个常见的算法问题,通常在二维网格(矩阵)中解决,其中 ‘1’ 表示陆地,‘0’ 表示水域。岛屿由水平或垂直相邻的陆地组成,我们需要计算岛屿的总数。函数遍历整个网格,当遇到一个未被访问的陆地单元格时,对其执行 DFS,并将岛屿数量加一。函数用于深度优先搜索岛屿的所有部分,并将遍历过的陆地标记为 ‘0’。这个问题可以通过深度优先搜索(DFS)来解决。

r081r096的博客 1236

C++面试宝典第20题:计算岛屿数量

在这道题中,我们学习了深度优先搜索算法和广度优先搜索算法。深度优先搜索(DFS):在DFS中,从起始节点开始,尽可能深地探索路径,直到找到目标状态或者无法继续前进为止。在此过程中,一旦到达一个新节点,就首先检查该节点是否为目标节点。如果不是,则访问其未被访问过的邻接节点。广度优先搜索(BFS):在BFS中,同样从起始节点出发,但首先访问所有与起始节点距离为1的节点,然后是距离为2的节点。依此类推,直至找到目标状态,或遍历完整个可达部分。

hope_wisdom的技术博客 1082

编程训练————岛屿数量C++

岛屿数量题目描述主要思想深度优先搜索广度优先搜索代码实现深度优先搜索广度优先搜索 题目描述 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿数量岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。 示例 1: 输入: [ [‘1’,‘1’,‘1’,‘1’,‘0’], [‘1’,‘1’,‘0’,‘1’,‘0’], [‘1’,‘1’,‘0’,‘0’,‘0’], [‘0’,‘0’,‘0’,‘0’,‘0’] ]

alicekizuna的博客 2302

NC109 岛屿数量

题目描述: 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。 岛屿: 相邻陆地可以组成一个岛屿(相邻:上下左右) 判断岛屿个数。 解题分析: 使用dfs遍历即可。 class Solution { public: /** * 判断岛屿数量 * @param grid char字符型vector<vector<>> * @return int整型 */ int so

MaopengLee的博客 449

【Hot 100 刷题计划】 LeetCode 200. 岛屿数量 | C++ DFS 题解

摘要 本文介绍了LeetCode 200岛屿数量C++解法,采用深度优先搜索(DFS)和Flood Fill算法。题目要求计算由'1'(陆地)和'0'(水)组成的二维网格中的岛屿数量,其中岛屿定义为水平或垂直相邻的陆地组成的连通块。 解题核心思路是: 遍历网格,当发现未被访问的'1'时,岛屿计数加1 使用DFS 洪水灌溉 算法标记该岛屿所有相连陆地为已访问 通过方向数组简化四个方向的移动处理 使用350x350的状态数组记录访问状态,兼顾效率与安全性 代码实现

qq_51233453的博客 803

LeetCode200岛屿数量DFS与BFS详解(多语言)

LeetCode 200题要求计算二维网格中的岛屿数量('1'表示陆地,'0'表示水)。岛屿由水平或垂直相邻的陆地连接形成。给出Python、Java和C++的DFS/BFS解法: DFS:递归遍历相邻陆地并标记,统计连通块数。时间复杂度O(mn),空间复杂度O(mn)(递归栈)。 BFS:使用队列逐层扩散标记陆地。时间同样O(mn),空间O(min(m,n))(队列优化)。 对比: DFS适合路径类问题,代码简洁但可能栈溢出; BFS天然适合最短路径,空间消耗较大但无溢出风险。 示例1输出1(单岛屿),示

2602_95354978的博客 208

DFS刷题笔记:岛屿问题

本文总结了LeetCode中三类岛屿问题的DFS解法:岛屿数量(200)、岛屿周长(463)和最大岛屿面积(695)。核心思想都是通过DFS遍历连通陆地,区别仅在于统计目标不同:连通块数量、边界周长或节点面积。解题时需遍历网格,遇到陆地就DFS扩展四个方向,并标记已访问节点。三题均采用相似模板,时间复杂度为O(n*m)。关键在于理解DFS在不同问题中的返回值设计:岛屿数量只需计数,周长计算边界贡献,面积累加节点数。

weixin_66162442的博客 254

从走迷宫到算法思维:如何用DFS解决LeetCode岛屿问题(C++保姆级拆解)

本文以LeetCode岛屿数量问题为例,详细拆解了深度优先搜索(DFS)算法在网格类问题中的应用。通过对比经典迷宫问题,阐述了DFS从路径搜索到连通块识别的思维跃迁,并提供了C++保姆级代码实现、复杂度分析及优化技巧,帮助读者掌握算法核心模式,提升解决同类问题的能力。

hp777的博客 172

LeetCode Hot 100 | 图论(C++ 题解)

题号题目难度核心思路时间复杂度空间复杂度200岛屿数量🟡 中等DFS 染色,标记 ‘2’O(m×n)O(m×n)994腐烂的橘子🟡 中等多源 BFS,逐轮扩散O(m×n)O(m×n)207课程表🟡 中等拓扑排序(Kahn BFS)判断有无环O(V+E)O(V+E)208实现 Trie🟡 中等哈希表 Trie 节点,isEnd 标记词尾O(L)O(总字符)

jcm0903的博客 238

2026 年 3 月 15 日刷题

今天的题目是有关 BFS 广度优先搜索的。BFS 可以理解是从树的顶端一层一层往下逐层遍历。维护一个队列,在遍历过程中不断加入符合要求的元素,最后当队列为空时返回。

m0_52163052的博客 48

leetcode200. 岛屿数量C++题解,附思维导图和流程图,一题带你弄懂图的dfs遍历算法

leetcode200. 岛屿数量C++题解,附思维导图和流程图,一题带你弄懂图的dfs遍历算法

热爱C++和golang的学生 4187

Leetcode 200. 岛屿数量

Leetcode 200. 岛屿数量1、问题分析2、问题解决3、总结 1、问题分析 题目链接:https://leetcode-cn.com/problems/number-of-islands/   本质上就是一个动态规划问题。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。 2、问题解决   笔者以C++方式解决。 #include "iostream" using namespace std; #include "algor

珍惜 8897

LeetCode200岛屿数量

若遇到未访问过的陆地则数量++, 并延展此块陆地的最大边界。

呆呆的猫的博客 1267

200. 岛屿数量【 力扣(LeetCode) 】

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿数量岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。

yyh520025的博客 1626

LeetCode200题_岛屿数量

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿数量岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。

qq_40263592的博客 1169

Leetcode——200岛屿数量

/** * \* Created: liuhuichao * \* Date: 2019/5/31 * \* Time: 27:37 PM * \* Description: 岛屿数量 * \ * 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿数量。 * 一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。 ...

我们的征途是星辰大海 1109

[C++]Leetcode200.岛屿数量

200. 岛屿数量 题目:给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿数量岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。 示例 1: 输入: [ [‘1’,‘1’,‘1’,‘1’,‘0’], [‘1’,‘1’,‘0’,‘1’,‘0’], [‘1’,‘1’,‘0’,‘0’,‘0’], [‘0’,‘0’,‘0’,‘0’,‘0’] ] 输出: 1 示例 2: 输入: [ [‘1’,‘1’,‘0’,‘0

cpb____的博客 432

LeetCode 200. 岛屿数量

LeetCode 200. 岛屿数量题目我的思路代码 题目 我的思路 我这里的解法使用的深度优先算法的思想 把探索过的岛屿直接标记为 x,没有额外创建一个数组 也可以参考之前写的 广度优先 和 深度优先 的解法和思路 LeetCode Java 队列结合广度优先算法(BFS)实现岛屿个数计算,附带详细分析 LeetCode Java 深度优先算法(DFS)实现岛屿个数计算,附带详细分析 代码 c...

乐之终曲 854
上一篇: 希尔排序的理解
下一篇: 力扣5. 最长回文子串C++详解
WalkTime
博客等级 码龄9年 1粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值