LeetCode 200. 岛屿数量 C++ 并查集

并查集(Disjointed Set)是一种非常精巧而且实用的数据结构,主要用于处理一些不相交集合的合并问题。


一、题目描述

![](https://img-blog.csdnimg.cn/6e6b0b4253d64d1fb4606e889b84643b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfMzk5NDA1MjI=,size_20,color_FFFFFF,t_70,g_se,x_16

二、样例

![在这里插入图片描述](https://img-blog.csdnimg.cn/2da7eafdbf6c4edba41a778f400107b0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfMzk5NDA1MjI=,size_20,color_FFFFFF,t_70,g_se,x_16

三、解题思路

1.求解步骤

利用并查集(数组a)记录连通的陆地,注意传入数组类型是char。
1,预处理并查集数组。
2,扫描grid数组,对陆地进行“向上、向左”的连通判定(注意小于0越界),一旦连通调用并查集合并函数更新。
3,扫描数组a,满足a[i][j]==i*n+j的点即可代表一个连通的陆地,因为递归查找并查集的根节点一定满足该式,不满足该式但属于同一连通块的可以不必记录。

2.AC代码

代码如下(C++):

class Solution {
public:
   int a[310][310];//并查集
   int m,n;
    void init_set()//初始化并查集,将二维坐标映射到一个整数
    {
         for(int i=0;i<m;i++)
         for(int j=0;j<n;j++)
          a[i][j]=i*n+j;
    }
    int find_set(int x)//并查集递归查找函数
    {
        int xx=x/n;
        int yy=x%n;
        return a[xx][yy]==x?x:find_set(a[xx][yy]);
    }
    void union_set(int x,int y)//并查集合并
    {
        x=find_set(x);
        y=find_set(y);
        if(x!=y){ int xx1=x/n,yy1=x%n;
        int xx2=y/n,yy2=y%n;
        a[xx1][yy1]=a[xx2][yy2];}
    }
    int numIslands(vector<vector<char>>& grid) {
            m=grid.size();
            n=grid[0].size();
            init_set();
            for(int i=0;i<m;i++)//扫描grid数组并合并连通岛屿
             for(int j=0;j<n;j++)
             {
                 if(grid[i][j]=='1')
                 {
                     if(j>0)
                     {
                        if(grid[i][j-1]=='1')union_set(a[i][j-1],a[i][j]);
                     }
                      if(i>0)
                     {
                         if(grid[i-1][j]=='1')union_set(a[i-1][j],a[i][j]);
                     }
                 }
             }
             int ans=0;
               for(int i=0;i<m;i++)
               for(int j=0;j<n;j++)
                 if(grid[i][j]=='1'&&a[i][j]==i*n+j)ans++;//若属于同一岛屿,则递归最终找到的根节点一定满足该式,只判断根节点    
             return ans;
    }
};

3.提交结果

在这里插入图片描述


总结

以上就是关于LeetCode 200. 岛屿数量 C++ 并查集的全部内容。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值