所以问题是:
我们有n个班级(n个区间),有开始时间和结束时间[si,fi],我们希望找到最小数量的教室,我们可以满足所有类别(间隔)而不会有任何勾结
我正在阅读的书中说我们可以在O(nlogn)中解决这个问题,但我找不到比O(n ^ 2)更好的算法
它说我们应该按照开始时间对它们进行排序,但是没有说出解决方案的其余部分,但这没有任何意义,因为在给每个班级一个房间之前,我们不应该检查所有其他间隔到看看我们是否有勾结?这使得O(n ^ 2)因为对于每个区间我们需要检查所有其他区间
我错过了什么吗?答案 0 :(得分:3)
您可以按时间对事件(事件是类的开头或类的结尾)进行排序。这将需要O(n log n)。
现在,保留一堆空房间并按顺序浏览事件:
第二阶段可以在O(n)中完成。
通过跟踪已完成的分配和解除分配,您可以轻松找到所需房间的数量和时间表。
如果您只需要所需房间的数量,可以简化为使用柜台而不是房间列表。为每个开始事件添加一个,并为每个结束事件减1;跟踪最大值。
答案 1 :(得分:0)
第一步:存储课程'在actions
数组中单独开始和结束点。如果该点是起始点,则type
的{{1}}为action
,如果它是某个类的结尾,则其+1
为type
。
第二步:按时间按升序对-1
数组进行排序。如果时间相等,则按actions
按升序排序。
第三步:将计数器设置为0,遍历type
数组,如果它是启动类型则将1添加到计数器,如果是完成类型则从计数器减去1。同样,如果时间相等,则首先执行完成类型。因为在那个房间的课程结束后你就可以使用同一个教室。
计数器达到的最大值是你的答案。
以下是python中算法的实现:
actions