在某些约束条件下找到最大会议数的算法

时间:2019-09-30 17:01:10

标签: python algorithm greedy

比方说,我想与一些朋友见面,他们向我发送他们可以间隔的几天见面的情况。例如,[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. 

我正在尝试找到最有效的解决方案,其中将效率定义为最佳的时间和空间复杂度。 (如有必要,可以优化空间上的时间)

1 个答案:

答案 0 :(得分:0)

我认为字典是一种存储此信息的好方法,其中的键是日期,值是朋友的数量。因此,您最终会得到这样的字典:

{1: 4, 2: 3, 3: 9, 4: 2}

从这本词典中我们可以看出,第一天有四个朋友可用。在第二天,三个朋友可用。在第三天,有九个朋友可用;第四天有两个朋友。因此,获胜者是第三天,因为它具有最大的价值。

要构建此词典,请将每个间隔扩展到其完整的天数列表。然后,对于每一天,如果字典中没有该天,则将其添加为1,否则增加其当前值。