题解 | 主持人调度(二)

主持人调度(二)

https://www.nowcoder.com/practice/4edf6e6d01554870a12f218c94e8a299

1、解题思路

这是一个典型的区间调度问题,可以通过贪心算法来解决。具体步骤如下:

  1. 排序活动:首先将所有的活动按照结束时间进行排序。如果结束时间相同,可以按开始时间排序。
  2. 贪心选择 :使用一个优先队列(最小堆)来记录当前正在进行活动的结束时间。 遍历排序后的活动,对于每个活动,检查堆顶的结束时间是否小于等于当前活动的开始时间。如果是,则可以将该主持人用于当前活动,更新堆顶的结束时间。如果不是,则需要新增一个主持人,将当前活动的结束时间加入堆中。
  3. 结果:最终堆的大小即为所需主持人的最小数量。

这种方法确保我们尽可能多地复用主持人,从而最小化主持人的总数。

2、代码实现

C++
#include <queue>
#include <vector>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 计算成功举办活动需要多少名主持人
     * @param n int整型 有n个活动
     * @param startEnd int整型vector<vector<>> startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间
     * @return int整型
     */
    int minmumNumberOfHost(int n, vector<vector<int> >& startEnd) {
        // write code here
        if (startEnd.empty()) {
            return 0;
        }

        // 按照开始时间排序
        sort(startEnd.begin(), startEnd.end(), [](const vector<int>& a,
        const vector<int>& b) {
            return a[0] < b[0];
        });

        // 最小堆, 存储结束时间
        priority_queue<int, vector<int>, greater<int>> minHeap;
        minHeap.push(startEnd[0][1]);

        for (int i = 1; i < startEnd.size(); ++i) {
            // 如果当前活动的开始时间大于等于堆顶的结束时间, 可以复用主持人
            if (startEnd[i][0] >= minHeap.top()) {
                minHeap.pop();
            }
            minHeap.push(startEnd[i][1]);
        }

        return minHeap.size();
    }
};

Python
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 计算成功举办活动需要多少名主持人
# @param n int整型 有n个活动
# @param startEnd int整型二维数组 startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间
# @return int整型
#
import heapq

class Solution:
    def minmumNumberOfHost(self , n: int, startEnd: List[List[int]]) -> int:
        # write code here
        if not startEnd:
            return 0
        
        # 按照开始时间排序
        startEnd.sort(key=lambda x: x[0])
        
        # 最小堆,存储结束时间
        min_heap = []
        heapq.heappush(min_heap, startEnd[0][1])
        
        for i in range(1, len(startEnd)):
            # 如果当前活动的开始时间大于等于堆顶的结束时间,可以复用主持人
            if startEnd[i][0] >= min_heap[0]:
                heapq.heappop(min_heap)
            heapq.heappush(min_heap, startEnd[i][1])
        
        return len(min_heap)

3、复杂度分析

  1. 排序活动:按照开始时间排序,以便后续贪心选择。
  2. 最小堆:用于动态维护当前正在进行活动的结束时间,确保可以及时复用主持人。
  3. 贪心选择:每次尽可能复用最早结束的主持人,从而减少新增主持人的数量。
  4. 时间复杂度:排序O(n log n),堆操作O(n log n),总时间复杂度O(n log n)。
  5. 空间复杂度:堆的大小最多为n,O(n)。
全部评论

相关推荐

08-15 11:13
门头沟学院 Java
感觉还行,题多但不难
投递米哈游等公司10个岗位
点赞 评论 收藏
分享
评估中了已经
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
也许是天气_:实习这块全是假大空像AI生成的,没有实际内容。要体现出难点、亮点、解决问题的过程
点赞 评论 收藏
分享
Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务