并查集--算法题

leetcode-200 islands

题意:

给出一个二维数组,只包含 1/0 。1表示陆地,0表示水,求岛屿个数。例:

input:

1 1 0 0 0  
1 1 0 0 0  
0 0 1 0 0  
0 0 0 1 1 
复制代码

output:

3

思路

  • 染色法
  1. 遍历数组
  2. 如果为1,则找到相邻的所有为1的节点,赋值为0,同时count++

2可以用DFS和BFS实现。

以下代码会对更改源数组,推荐用visited[]。

DFS:每个节点都判断附近有没为1的节点,伪代码如下:

    function DFS(x, y)
        if (int[x][y] := 1){
            int[x][y] := 0
            DFS(x, y+1)
            DFS(x, y-1)
            DFS(x+1, y)
            DFS(x-1, y)
        }
复制代码

BFS:将所有附近为1的节点都放到queue中,再逐个清理

    function BFS(x, y)
        q.offer(x, y)
        while (!q.isEmpty){
            (i, j) := q.poll()
            int(i, j) := 0
            if int[i+1][j] := 1 q.offer(i+1, j)
            if int[i-1][j] := 1 q.offer(i-1, j)
            if int[i][j+1] := 1 q.offer(i, j+1)
            if int[i][j-1] := 1 q.offer(i, j-1)
        }
复制代码
  • 并查集
  1. 初始化“1”的节点的root为自己
  2. 遍历所有节点,相邻合并(只做统计这里可以)
  3. 遍历parent,获取详情

leetcode-547 Friend Circle

题意

给定一个二维矩阵(权图),1表示认识,0表示不认识,求有多少朋友圈。例:

   A B C  
A  1 1 0  
B  1 1 0  
C  0 0 1  
复制代码

思路

这题和leetcode-200其实是一样的,如果有连续相连的“1”,说明这些人互相认识,也就是一个朋友圈,求朋友圈个数也是求有多少个岛屿;也是典型的图的边的矩阵表示方式。

leetcode-200、547直接用并查集方法即可,详见并查集-理论


欢迎关注微信公众号,提供思想和技术类原创文章。微信搜索小兵张健或扫描以下二维码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值