主持人调度问题

277 阅读2分钟

image.png

贪心作法

关于这个题,思路很简单,要让主持人最少,那么需要找到不重合时间的活动.怎么找到不重合时间?我们可以把上次的结束时间和这一次的开始时间做比较。找出有几个不重合的,它们都属于同一个主持。然后剩下活动可以继续这样.

图示如下:

image.png

我最开始想到是arr[i][1]<=arr[i+1][0].但是后来发现,如果出现上图情况,那么时间复杂度会变大。因为第一层没有满足[1,6]单出来。然后是[1,2]开头...

所以我们选择使用数组来获取各个活动的开始和结束时间,然后分别开始时间和结束时间进行排序,方便后面判断是否相交 遍历n个活动,如果某个活动开始的时间大于之前活动结束的时候,当前主持人就够了,活动结束时间往后一个。若是出现之前活动结束时间晚于当前活动开始时间的,则需要增加主持人。

代码如下:

image.png

优先队列

优先队列即PriorityQueue,是一种内置的机遇堆排序的容器,分为大顶堆与小顶堆,大顶堆的堆顶为最大元素,其余更小的元素在堆下方,小顶堆与其刚好相反。

重载sort函数,将开始时间早的活动放在前面,相同情况下再考虑结束时间较早的。

使用小顶堆辅助,其中堆顶是还未结束的将要最快结束的活动的结束时间。

首先将int的最小数加入堆中,遍历每一个开始时间,若是堆顶的结束时间小于当前开始时间,可以将其弹出,说明少需要一个主持人。

除此之外,每次都需要将当前的结束时间需要加入堆中,代表需要一个主持人,最后遍历完成,堆中还有多少元素,就需要多少主持人。

image.png

image.png

代码如图:

image.png