题解 | #主持人调度#

主持人调度

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

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

方法一:队列思想求解

求解思路
对于本题目关于主持人个数的求解,我们首先将start和end按时间的早晚进行排序。如果开始时间相同,则按结束时间进行排序。然后我们使用队列,如果当前开始时间大于等于之前某个活动的结束时间,说明可以让之前那个主持人继续主持当前的活动。否则,将当前活动的结束时间入队表示需要新增一个新的主持人。

图片说明

解题代码

class Solution {
public:
    int minmumNumberOfHost(int n, vector<vector<int> >& startEnd)
    {
        std::map<int, int> hycounter;
        for (auto &v : startEnd)
        {
            hycounter[v[0]]++; // v0的数目+1
            hycounter[v[1]]--; // v1的数目-1
        }
        int sum = 0; // 存储求和结果
        int hyres = 0; // 存储结果
        for (auto &v : hycounter)
        {
            sum += v.second;
            hyres = std::max(hyres, sum);
        }
        return hyres; // 返回结果
    }
};

复杂度分析
时间复杂度:使用快排函数的接口,因此其时间复杂度为
空间复杂度:使用队列queue,queue采用了堆结构,引入额外的内存地址空间,因此空间复杂度为,其中K代表队列queue的大小。

方法二:贪心思想求解

求解思路
对于本题目,我们可以采用贪心的思想来进行求解。首先建立start数组和end数组用来记录时间。接着我们遍历start数组,判断当前开始时间是否大于等于最小的结束时间,如果是,则说明当前主持人可以搞定。如果否,则需要新增一个主持人,并将end数组下标后移。

图片说明

解题代码

import java.util.*;
public class Solution {
    public int minmumNumberOfHost (int n, int[][] startEnd) {
        int[] hystart = new int[n]; // 初始化两个数组,分别记录开始时间和结束时间
        int[] hyend = new int[n];
        for(int i = 0;i<n;i++)
        {   //将活动的开始和结束时间赋值道start和end数组
            hystart[i] = startEnd[i][0];
            hyend[i] = startEnd[i][1];
        }
        //按从小到大的顺序对start和end数组排序
        Arrays.sort(hystart);
        Arrays.sort(hyend);
        int hyres = 0,index = 0;
        for(int i = 0;i<n;i++)
        {   //如果大于等于当前最小的结束时间,说明当前主持人可以搞定
            if(hystart[i] >= hyend[index])
            {
                index++;
            }
            //否则,需要新增主持人
            else
            {
                hyres++;
            }
        }
        return hyres; // 返回结果
    }
}

复杂度分析
时间复杂度:使用快排的接口,因此时间复杂度为
空间复杂度:引入start和end数组,因此空间复杂度为,其中K代表start和end数组的大小。

算法 文章被收录于专栏

算法题的题解以及感受

全部评论

相关推荐

05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
点赞 评论 收藏
分享
qq乃乃好喝到咩噗茶:院校后面加上211标签,放大加粗,招呼语也写上211
点赞 评论 收藏
分享
06-23 17:45
门头沟学院 Java
里面的项目啥的真的有用吗?&nbsp;这些人是割韭菜吗?
HellowordX:很简单,如果你有自己稳定的学习路线和获取知识的方式就没必要,如果你啥都不懂的小白或者里边有你感兴趣的知识,我觉得挺值,我也经常为知识付费,因为时间精力有限,很多东西我不可能自己重复造轮子
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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