由一道面试题到并查集

面试题引入

问题描述:

假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友…),

则认为他们属于同一个朋友圈,

请写程序求出这n个人里一共有多少个朋友圈。

假如:n = 5, m = 3, r = { {1 , 2} , {2 , 3} ,{4 , 5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友,

则1、2、3属于一个朋友圈,4、5属于另一个朋友圈,结果为2个朋友圈。

最后请分析所写代码的时间、空间复杂度。评分会参考代码的正确性和效率。

问题分析

这道题本质上是其实是求解一个图中有多少无向连通分量的问题,如下图:
这里写图片描述

上图1,2,3,4,5可以看作是一个图中的节点, r = { {1 , 2} , {2 , 3} ,{4 , 5}}是这个图中顶点与顶点之间的连接关系。我们要求构成朋友圈的个数,只要求图中连通图的个数即可,如本题中的链接关系,我们可知道图中最小连通图的个数为2,所以构成朋友圈的个数为2。
虽然这种解法可以得到问题的最终结果但是这种解法需要遍历整个图,如果是邻接表来表示图,那么遍历整个图的时间复杂度为O(N*N),还有建立图等问题也有时间复杂度的消耗,所以总的来说这不是面试官喜欢的解法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值