我有一个名字对的数组,如下:
[
['alison', 'jason'],
['alison', 'chris'],
['john', 'bill'],
['bill', 'alex'],
['alex', 'jack']
]
我正在尝试编写一个方法,可以接受这个参数,并返回
[
['alison', 'jason', 'chris'],
['john', 'bill', 'alex', 'jack']
]
在O(N^2)时间复杂度之内找到更好的解决方案。我的尝试如下:
def teams(arr)
pair_hash = {}
arr.each do |pair|
if pair_hash[pair[0]].nil?
pair_hash[pair[0]] = [pair[1]]
else
pair_hash[pair[0]].push(pair[1])
end
end
teams = []
pair_hash.map do |leader, team|
teams.push(find_teammates(pair_hash, leader, team))
end
teams
end
def find_teammates(hash, leader, team)
result = [leader]
team.each do |member|
if hash[member].nil?
result += [member]
else
result += find_teammates(hash, member, hash[member])
end
end
result
end
但是这个解决方案在结果中有额外的团队,并且我能想到的每种解决方案都涉及非常糟糕的时间复杂度。如果您有任何想法,可以在不仅仅通过所有配对进行蛮力的情况下解决此问题,我会很愿意知道。