标题: 牛客题解-在线编程-面试笔刷:BM96 主持人调度(二)Python解法 [打印本页] 作者: 小小小幸运 时间: 2025-4-28 21:53 标题: 牛客题解-在线编程-面试笔刷:BM96 主持人调度(二)Python解法 形貌:
有 n n n个活动即将举办,每个活动都有开始时间与活动的结束时间,第 i i i个活动的开始时间是 s t a r t i start_i starti,第 i i i个活动的结束时间是 e n d i end_i endi,举办某个活动就必要为该活动准备一个活动主持人。
一位活动主持人在同一时间只能参与一个活动。并且活动主持人必要全程参与活动,换句话说,一个主持人参与了第 i i i个活动,那么该主持人在 ( s t a r t i , e n d i ) (start_i,end_i) (starti,endi)这个时间段不能参与其他任何活动。求为了成功举办这 n n n个活动,最少必要多少名主持人。 数据范围: 1 ≤ n ≤ 1 0 5 1 \leq n \leq 10^5 1≤n≤105, − 2 32 ≤ s t a r t i ≤ e n d i ≤ 2 31 − 1 -2^{32} \leq start_i \leq end_i \leq 2^{31} - 1 −232≤starti≤endi≤231−1 复杂度要求:时间复杂度 O ( n log n ) O(n \log n) O(nlogn),空间复杂度 O ( n ) O(n) O(n) 示例1
输入: 2 , [ [ 1 , 2 ] , [ 2 , 3 ] ] 2, [[1,2],[2,3]] 2,[[1,2],[2,3]]
返回值: 1 1 1
说明:只必要一个主持人就能成功举办这两个活动 示例2
输入: 2 , [ [ 1 , 3 ] , [ 2 , 4 ] ] 2, [[1,3],[2,4]] 2,[[1,3],[2,4]]
返回值: 2 2 2
说明:必要两个主持人才气成功举办这两个活动 备注:
1 ≤ n ≤ 1 0 5 1 \leq n \leq 10^5 1≤n≤105
s t a r t i , e n d i start_i,end_i starti,endi在 i n t int int范围内
题解
为了实现找到成功举办这 n 个活动所需的最少主持人数量的功能,并且满足时间复杂度 O ( n log n ) O(n \log n) O(nlogn) 和空间复杂度 O ( n ) O(n) O(n) 的要求,我们可以采用以下思路:
思路
优先队列即PriorityQueue,是一种内置的机遇堆排序的容器,分为大顶堆与小顶堆,大顶堆的堆顶为最大元素,别的更小的元素在堆下方,小顶堆与其刚好相反。且由于容器内部的次序基于堆排序,因此每次插入元素时间复杂度都是 O ( l o g 2 n ) O(log_2n) O(log2n),而每次取出堆顶元素都是直接取出。
具体做法:
step 1:重载sort函数,将开始时间早的活动放在前面,相同环境下再思量结束时间较早的。
step 2:利用小顶堆辅助,其中堆顶是还未结束的将要最快结束的活动的结束时间。
step 3:起首将int的最小数加入堆中,遍历每一个开始时间,如果堆顶的结束时间小于当前开始时间,可以将其弹出,说明少必要一个主持人。
step 4:除此之外,每次都必要将当前的结束时间必要加入堆中,代表必要一个主持人,最后遍历完成,堆中还有多少元素,就必要多少主持人。