题解|NC147主持人调度

主持人调度

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

主持人调度

描述
有n个活动即将举办,每个活动都有活动的开始时间与活动的结束时间,第i个活动的开始时间是,第i个活动的结束时间是,举办某个活动就需要为该活动准备一个活动主持人。一位活动主持人在同一时间只能参与一个活动。并且活动主持人需要全程参与活动,换句话说,活动主持人参与了第i个活动,那么该主持人在,这个时间段不能参与其他任何活动。求为了成功举办这n个活动,最少需要多少名主持人。

这道题的核心思路是在于考察同一时刻最多有多少场活动同时进行。

解法1: 遍历时刻
先根据所有活动的起止时间,获得最先开始的时间和最后开始的时间。
因为所有的起止时间都是整数,所以我们可以按整数进行遍历。并对每一时刻统计,这一时刻有多少活动正在进行。
时间复杂度:,空间复杂度

解法2: 通过堆模拟活动的开始和结束
使用堆保存每个活动的结束时间,并在有新活动开始时,把已经结束的活动从堆中删除出去,再将当前活动的结束时间插入堆。
此时堆的大小即为同时存在的活动数量。
通过将所有任务按时间顺序经上述处理,当堆大小最大时,即为活动最多的时刻。
时间复杂度:,空间复杂度

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) {
        std::sort(startEnd.begin(), startEnd.end(), [](const vector<int>& a, const vector<int>& b) {
            return a[0] < b[0];
        });
        std::priority_queue<int, std::vector<int>, std::greater<int>> heap;
        int result = 0;
        for (auto &v : startEnd) {
            while (!heap.empty() && heap.top() <= v[0]) heap.pop();
            heap.push(v[1]);
            result = std::max(result, static_cast<int>(heap.size()));
        }
        return result;
    }
};

解法3: 按时刻统计活动数量
由题可知,活动数量只会在活动开始或者活动结束的时候变化。
所以我们只需要记录这些时刻活动数量的变化值,就可以通过累加得到活动数量的变化,进而求得活动数量的最大值。
时间复杂度:,空间复杂度
图片说明

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) {
        std::map<int, int> counter;
        for (auto &v : startEnd) {
            counter[v[0]]++;
            counter[v[1]]--;
        }
        int sum = 0;
        int result = 0;
        for (auto &v : counter) {
            sum += v.second;
            result = std::max(result, sum);
        }
        return result;
    }
};
全部评论
我的答案对不上,跑第二个这个实例没通过,答案是19,我跑的答案是34,我觉得我是对的,比如区间[19,992]和[15,329]都是跟其他所有区间重合的 34,[[547,612],[417,551],[132,132],[168,446],[95,747],[187,908],[115,712],[15,329],[612,900],[3,509],[181,200],[562,787],[136,268],[36,784],[533,573],[165,946],[343,442],[127,725],[557,991],[604,613],[633,721],[287,847],[414,480],[428,698],[437,616],[475,932],[652,886],[19,992],[132,543],[390,869],[754,903],[284,925],[511,951],[272,739]] 下面是我的代码,我是思路是排序二维数组,然后找重合的区间最多右几个: public int minmumNumberOfHost (int n, int[][] startEnd) { // 求同一时间点,最多重叠区间数 int[] nums = new int[n]; for (int i = 0; i < n; i++) { nums[i] = 1; } // 一个区间跟几个其他区间重合 int max = 1; Arrays.sort(startEnd, (a,b) -> a[0] - b[0]); for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { if (isChongHe(startEnd[i], startEnd[j])) { nums[i]++; nums[j]++; } else { break; } } if (max < nums[i]) { max = nums[i]; } } return max; } public boolean isChongHe(int[] a, int[] b) { if (a[1] > b[0] && a[0] < b[1]) { return true; } return false; }
点赞 回复 分享
发布于 2023-12-07 17:41 广东
解法3的时间复杂度为什么是O(nlogn)呢,两次循环遍历的数组长度都是O(n)的,最后的时间复杂度不应该是o(n)吗,不解
点赞 回复 分享
发布于 2023-02-28 10:17 甘肃
这也太妙了吧,感谢楼主,赞赞赞
点赞 回复 分享
发布于 2022-08-19 23:13 重庆

相关推荐

熊大不大:总之很难,我偷偷听到字节项目的人说,现在的人越来越人,学历越来越高,就是往难的面试,择优而选
发面经攒人品
点赞 评论 收藏
分享
作为带过好几个实习生的老mentor,我见过有同学带着一腔热血来实习,最后却只带走一份单薄的履历。实习,是你从学校到职场最关键的过渡期,它的价值远不止一份实习证明。今天,我不讲大道理,就从我作为Mentor的视角,给你们几条能立刻用上的建议。记住,你的目标不是当个好学生,而是成为一个值得信赖的职场新人。一、&nbsp;心态转变:从被动答题到主动解题这是我最想强调的一点。学生思维是:等待老师布置明确的作业,然后完成它。职场思维是:主动发现模糊的问题,然后解决它。反面事例:接到任务后,埋头就做,遇到困难不吭声,直到截止日期才说“这个我不会”。Mentor期待的是啥呢?首先是确认目标:接到任务后,先用自己的话复述一遍:“我理解这个任务是要达成XX效果,对吗?”&nbsp;确保方向没错。然后是主动思考:不要只带问题来,要带“选择题”。问“这个数据我不会查,我尝试了A和B方法都失败了,您看是方法C更合适,还是我有其他没考虑到的渠道?”&nbsp;这证明了你的思考和努力。最后是闭环思维:任务完成后,主动告知结果:“XX任务已完成,数据/文件已发您邮箱,并同步在团队网盘了。其中有个小发现是……,供您参考。”&nbsp;让一切有始有终。二、&nbsp;沟通方式:实习生的很多错误,都源于“想当然”和“不敢问”。反面教材:在做一个PPT时,因为不确定公司模板,就套用了自己觉得好看的模板,结果不能用。那么怎么确认,怎么提问呢?第一个,不懂就问,但别重复问:第一次问,是学习;同样的问题问第三次,就是不用心。准备一个笔记本,把关键信息、操作流程、注意事项都记下来。第二个,及时汇报,别等追问:特别是遇到卡壳或可能延期时,一定要提前说。Mentor不怕你慢,就怕你失联。没事儿更新一下进度:目前已完成80%,但在XX环节遇到点阻力,正在想办法沟通等回复,预计今天下班前确定结果,到时候给您,这样说能让人极度安心。第三个,珍惜1on1机会:和Mentor的定期沟通,不是你被动接受批评,而是你主动获取信息和反馈的黄金时间。提前准备好:a)&nbsp;本周工作进展;b)&nbsp;遇到的困惑/挑战;c)&nbsp;希望学习的新技能;d)&nbsp;对团队业务的任何好奇。三、&nbsp;工作习惯:&nbsp;专业性体现在细节里职业素养不是空话,它藏在每一个你容易忽略的细节中。1.&nbsp;邮件/沟通软件礼仪:邮件:标题清晰(如【实习生XX-XX项目周报】),正文称呼得体,结尾有落款。别用“在吗?”开头。工作群:别发表情包刷屏,沟通事情简明扼要。收到任务或通知,回复“收到,谢谢”,这是基本的确认和尊重。2.&nbsp;文件管理与命名:我会观察实习生的桌面,看他们的使用习惯,乱糟糟的桌面说明他没条理。文件命名要使用统一的命名规则:日期_项目名_内容_版本_姓名。例如:20231027_秋招海报_初版_张三。这能为整个团队节省大量沟通成本。3.&nbsp;对待杂活的态度:复印、整理数据、会议纪要……这些dirty&nbsp;work是不可避免的。但优秀的人是能从中找到价值的:整理数据时,可以留意数据之间的关联或异常,做会议纪要时,可以梳理出会议的决策和待办事项。四、&nbsp;终极目标:带走三样东西1.&nbsp;一段能讲出STAR法则的实战经历:这直接决定了你未来求职简历的厚度。2.&nbsp;一位可以为你未来背书的Mentor/同事:好好表现,离职时保持联系,他们可能成为你未来求职的推荐人和内推渠道。3.&nbsp;对行业和岗位的真实认知:通过这次实习,你想清楚自己是更热爱这个行业,还是想赶紧跑路?这个答案,价值千金。最后,作为你们的Mentor,我想说:大胆去试,勇敢去问,别怕犯错。实习期是你犯错成本最低的时候。展现出你的靠谱、主动和思考,我们做Mentor的,会非常乐意把更核心的任务交给你,因为带你,也是在为团队培养未来的战友。希望这些建议能帮你少走弯路,打一场漂亮的实习战!
家族企业:实习一年比在大学多年都有用
第一次找实习,我建议__
点赞 评论 收藏
分享
评论
43
8
分享

创作者周榜

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