比方说,我想与一些朋友见面,他们向我发送他们可以间隔的几天见面的情况。例如,[1,4]表示朋友可以在1,2,3和4天见到我。我有一个清单,其中列出了我所有朋友的时间间隔,其中list [i] =朋友i的时间间隔。我的限制是每天只能见一个朋友。我该如何编写算法来查找可以结识的最大朋友数?
输入是名为times
的元组列表
times = [(2,6), (2,20), (3,3), (5,6)] max_meetings(times) = 4
因为一个人可以在第二天见到Friend1,在第四天见到Friend2,在第三天见到Friend3,在第五天见到Friend4。
我的代码在这里做天真的解决方案,生成所有可能的会议时间的n元组,然后只检查是否适合约束。
allPossibleSolutions = []
def helper(arr, spotsTaken, ind):
if ind == len(arr):
return
for j in range(arr[ind][0], arr[ind][1]+1):
if j not in spotsTaken:
allPossibleSolutions.append(spotsTaken+[j])
helper(arr, spotsTaken+[j], ind+1)
def max_meetings(times):
helper(times, [], 0)
myMax = 0
for sol in allPossibleSolutions:
if len(sol) > myMax:
myMax = len(sol)
return myMax
ret = max_meetings([[2, 2], [4, 5], [4, 10], [5, 6], [5, 7], [6, 6]])
# ret = 6, correct answer for this.
我正在尝试找到最有效的解决方案,其中将效率定义为最佳的时间和空间复杂度。 (如有必要,可以优化空间上的时间)
答案 0 :(得分:0)
我认为字典是一种存储此信息的好方法,其中的键是日期,值是朋友的数量。因此,您最终会得到这样的字典:
{1: 4, 2: 3, 3: 9, 4: 2}
从这本词典中我们可以看出,第一天有四个朋友可用。在第二天,三个朋友可用。在第三天,有九个朋友可用;第四天有两个朋友。因此,获胜者是第三天,因为它具有最大的价值。
要构建此词典,请将每个间隔扩展到其完整的天数列表。然后,对于每一天,如果字典中没有该天,则将其添加为1,否则增加其当前值。