Leetcode200. 岛屿数量C++详解

本文详细解析LeetCode第200题——岛屿数量的C++实现。通过深度优先搜索(DFS)算法,找出迷宫图中所有连通的陆地区域,并记录其数量。在遍历过程中,已访问过的点直接标记为水,避免重复计算。最终返回联通分量的总数。

力扣200. 岛屿数量

一、题目解析:

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

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

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

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

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

   一个思维误区:

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

 

二、算法代码

class Solution {

public:

    int n,m;

    int count=0;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值