算法挑战赛1--合并有交集的集合

有N个集合,合并有交集的集合,直到任意两个集合不存在交集,输出合并后的集合列表, 例如:

{a} {b,c} {b,d} {d,e} {f,g}  合并后:{a} {b,c,d,e} {f,g}

标签: 交集、集合、合并、挑战赛、列表、面试
猜你感兴趣的圈子:
每日一算法
  • k6k4

    creat2012
    2017-04-30 10:32:29 1楼#1层

    解决方案:

    采用hash的方法,key为字符串,value为一个链表,存储集合编号。

    算法思想:

    用一个数组来存储集合合并关系,如果有N个集合,则用a[N]来存储,元素初始化为-1.

    首先,将集合从左往右进行编号:0,1,2,。。。

    然后,逐个遍历集合中的字符串,采用hash方法进行映射:先将该集合添加到对应链表中;然后,数组中该集合对应元素如果为-1,则改为链表中最小集合编号,如果不为-1,则不作修改,继续读取下一个字符串,重复该操作。

     

    例如:

    {a},{c},{a, b}, {c, d}

    分析过程如下:

    首先分别编号为0,1,2,3

    先读入字符串a:

    a 0 [0, -1, -1, -1] // 集合0对应元素原来为-1,故写入编号0

    c 1 [0, 1, -1, -1]

    a 0,2 [0,1,0,-1] //集合2对应元素原来为-1,故写入该链表中最小编号0

    b 2 [0,1,0,-1] //集合2对应元素不为-1,故不做修改

    c 1,3 [0,1,0,1]

    d 3 [0,1,0,1]

    由此,可知0,2为同一集合,1,3为一个集合。

  • 回复
隐藏