题解 | #主持人调度#

主持人调度

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

题意整理

  • 有n个活动即将举办,每个活动都有一个开始时间和结束时间。
  • 现在派若干个主持人来主持活动,要求每一个主持人主持的活动中,各个活动的时间段(开始时间到结束时间)不重叠。

方法一(优先队列)

1.解题思路

  • 首先对startEnd按开始时间从小到大排序,如果开始时间相同,则按结束时间排序。
  • 然后初始化一个优先队列。
  • 如果当前开始时间大于等于之前某个活动的结束时间,说明可以让之前那个主持人继续主持当前的活动;否则,将当前活动的结束时间入队,表示需要新派一个主持人。

动图展示:
图片说明

2.代码实现

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算成功举办活动需要多少名主持人
     * @param n int整型 有n个活动
     * @param startEnd int整型二维数组 startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间
     * @return int整型
     */
    public int minmumNumberOfHost (int n, int[][] startEnd) {
        //如果开始时间相同,按结束时间从小到大排序,否则按开始时间排序
        Arrays.sort(startEnd,(o1,o2)->o1[0]==o2[0]?o1[1]-o2[1]:o1[0]-o2[0]);

        //初始化优先队列
        PriorityQueue<Integer> queue=new PriorityQueue<>();
        for(int[] activity:startEnd){
            //如果当前开始时间大于等于之前某个活动的结束时间,说明可以让之前那个主持人继续主持当前的活动
            if(!queue.isEmpty()&&queue.peek()<=activity[0]){
                queue.poll();
            }
            //如果不满足,需要新派一个主持人
            queue.offer(activity[1]);
        }

        return queue.size();

    }
}

3.复杂度分析

  • 时间复杂度:首先sort()接口的时间复杂度是图片说明 ,而优先队列queue是一个小顶堆,插入与移除的时间复杂度都是图片说明,总共需要操作n次,所以时间复杂度为图片说明
  • 空间复杂度:最坏情况下,需要额外大小为n的堆存储结束时间,所以空间复杂度为图片说明

方法二(排序+贪心)

1.解题思路

  • 首先建立两个数组分别存储开始时间(记为start)和结束时间(记为end)。
  • 然后分别对start和end数组进行排序。
  • 接着遍历start数组,判断当前开始时间是否大于等于最小的结束时间,如果是,则说明当前主持人就可以搞定(对应当前最小的结束时间的那个活动);如果否,则需要新增一个主持人,并将end数组下标后移(表示对应的活动已经有人主持)。

2.代码实现

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算成功举办活动需要多少名主持人
     * @param n int整型 有n个活动
     * @param startEnd int整型二维数组 startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间
     * @return int整型
     */
    public int minmumNumberOfHost (int n, int[][] startEnd) {
        //初始化两个数组,分别记录开始时间和结束时间
        int[] start=new int[n];
        int[] end=new int[n];

        //将活动的开始和结束时间赋值道start和end数组
        for(int i=0;i<n;i++){
            start[i]=startEnd[i][0];
            end[i]=startEnd[i][1];
        }

        //按从小到大的顺序对start和end数组排序
        Arrays.sort(start);
        Arrays.sort(end);

        int res=0,index=0;
        for(int i=0;i<n;i++){
            //如果大于等于当前最小的结束时间,说明当前主持人可以搞定
            if(start[i]>=end[index]){
                index++;
            }
            //否则,需要新增主持人
            else{
                res++;
            }
        }

        return res;

    }
}

3.复杂度分析

  • 时间复杂度:需要进行排序,排序接口的时间复杂度是图片说明,所以时间复杂度为图片说明
  • 空间复杂度:需要额外大小为n的start和end数组,所以空间复杂度为图片说明
xqxls的题解 文章被收录于专栏

牛客题解

全部评论
还得题解靠谱,比评论区的易懂多了,评论区的太抽象了
点赞 回复 分享
发布于 2023-07-27 17:09 北京
Arrays.sort 会出现Integer范围越界,不能直接减
点赞 回复 分享
发布于 2023-05-22 14:47 北京
优先队列方法有一个测试用例过不了唉
点赞 回复 分享
发布于 2023-03-23 16:23 北京

相关推荐

昨天 13:24
已编辑
江西农业大学 后端工程师
最近或许大家都听说xxxx厂裁员,无论前端,后端,大数据,测试,运维,人人可危,&nbsp;“前端死了,后端也死了,JAVA崩盘了,你们这群搞大模型的真是码奸”这次AI真的会让我们无路可走吗????????太阳底下已经没有新鲜事了旧的生产力的消失,必然有新的生产力诞生马车夫消失&nbsp;→&nbsp;汽车司机、修车工、石油工业诞生,从业人数是马车夫的百倍手工纺织女工消失&nbsp;→&nbsp;纺织机械工程师、面料设计师诞生,纺织品产量提升百倍2007年苹果开放&nbsp;App&nbsp;Store,&quot;移动端开发者&quot;这个职业压根不存在。八年后,全球应用经济规模突破&nbsp;1000亿美元,凭空诞生了数百万开发者岗位。每一次&quot;这次真的完了...
二十岁的编程男神王大...:那这个时代是什么时代呢? 是全员agent的时代,是前端+AI,后端+AI的时代,AI已经融入了项目生命周期的的每一个角落,那我最近在做的东西举例,检查BUG时,我们会用codex,CC等工具的skill去check,效果好还能直接fix,测试的时候,apifox等工具已经有了AI落地的改造,CI/CD阶段,我们会根据hook去跑AI check脚本,就连不少中间件,也迎来了AI落地的改造,(AI网关,AI在MQ中的运用),都可以去了解下 另外记着,这些东西不是意义,工作只是谋生的一个手段,ai是让开发提效了,但是呢,原先一周的工作流程压缩到了两天内,同时低级的都裁员了,只有高级的去维护,你看似写的大义凛然,或许那天你也会成为你文章里面拒绝往前走的人,你才大二,面对技术有热情是对的
AI求职实录
点赞 评论 收藏
分享
牛客44320985...:你的当务之急是把这个糖的要死的沟槽ide主题改了
点赞 评论 收藏
分享
评论
20
2
分享

创作者周榜

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