2019.03.05-算法-朋友分组问题

JAVA学习网 2019-03-06 12:25:02

从业务上抽离出来的问题。

条件:

假设有一个已知的list:

List<String>  list= new ArrayList<String>();

list.add("A");

list.add("B");

list.add("C");

list.add("D");

……

假设每一个字母代表一个人,人与人之间有两种关系:相容互斥通过isFriendly(a,b)可以获得两人之间的关系

一个朋友圈中所有人都必须相容,且无法再加入其他成员。

例如list有4个人A、B、C、D, AB互斥  其他均相容 ,则可以得到两个朋友圈{ACD}  {BCD}

——————

求:如何得到所有不同的朋友圈?

思路1:将所有人两两组合,形成两人朋友圈,接着两人朋友圈尝试添加其他人,形成3人朋友圈……直至所有朋友圈无法加人:,剔除掉重复朋友圈后得到所有不同的朋友圈。

(思路1光想想就脑壳痛……而且当所有人相容的时候显得很傻比= =)

 

思路2:先以A为核心,遍历所有人,找到所有与A相容的人,接而形成以A为中心辐射的朋友圈。   

             而第一个与A互斥的人,形成新的核心X……找到与该核心相容的人,形成以核心为辐射的新的朋友圈……

             第三个核心不能与A、X 兼容 ……

             当不再产生新的核心,代表所有朋友圈已经找到。

 其他思路暂时没想到,个人感觉思路2也不是很高效,欢迎有思路的大佬们指点。

——————————

思路2实现:未完待续……

 

阅读(2755) 评论(0)