在python中做了一些学习问题,我遇到了一个挑战,我遇到了麻烦。
REQS
我有一个列表列表,其中第一个和最后一个项目分别是会议的开始和结束时间。
“可能的会议”是会议1和2的开始和结束时间可以相同或者1< 2,但它们不能重叠。所以在:
[[0,1][1,2][2,3],[2,5]]
有3次可能的会议,因为第1次,第2次和第3次会议都可以按顺序发生,但最后一次不能 - 或者至少如果最后一次会议可能发生,第3次会议不能。
我需要返回可能的会议次数
没有任何适当算法的特殊知识,这些知识在这里运行良好(仍然在学习),我的方法是对列表列表进行排序,并将它们与下一个列表进行比较,以查看是否有会议是可能的。问题的所有给定集合至少可以召开一次会议(因为必须至少召开一次会议)。
这是我到目前为止在python3.4中所拥有的:
def answer(meetings):
index = 0
nextIndex = index + 1
possibleMeetings = 1
impossibleMeetings = 0
sortedMeetings = sorted(meetings)
for item in sortedMeetings:
firstItem = item[1]
secondItem = sortedMeetings[nextIndex][0]
if firstItem <= secondItem:
possibleMeetings +=1
nextIndex+=1
elif firstItem > secondItem:
impossibleMeetings +=1
nextIndex+=1
if nextIndex == len(sortedMeetings):
break
index +=1
return possibleMeetings, impossibleMeetings
问题:
我觉得这是一种蛮力的方式来排序和比较它们
我认为它不会很好地扩展
有可能会破坏它
这里的任何帮助将不胜感激!希望扩展我对这类问题可能性的概念。谢谢!
答案 0 :(得分:3)
区间调度优化是{{3}}:
中描述的贪婪算法的标准问题以下贪婪算法确实找到了最佳解决方案:
选择间隔x,以最早的结束时间。
从候选区间集合中删除x,以及与x相交的所有区间。
- 醇>
继续,直到候选区间组为空。
您当前的解决方案只需要O(nlogn)进行排序,加上循环的O(n)操作,因此这是一种非常有效的方法,可以很好地扩展。
然而,这并不完全正确,因为:
您可以使用以下代码解决这些问题:
def answer(meetings):
last_end = -1
ans = 0
for end,start in sorted( (end,start) for start,end in meetings ):
if start >= last_end:
last_end = end
ans += 1
return ans, (len(meetings) - ans)