NC147 主持人调度(贪心)

描述

有 n 个活动即将举办,每个活动都有开始时间与活动的结束时间,第 i 个活动的开始时间是 starti ,第 i 个活动的结束时间是 endi ,举办某个活动就需要为该活动准备一个活动主持人。

一位活动主持人在同一时间只能参与一个活动。并且活动主持人需要全程参与活动,换句话说,一个主持人参与了第 i 个活动,那么该主持人在 (starti,endi) 这个时间段不能参与其他任何活动。求为了成功举办这 n 个活动,最少需要多少名主持人。

输入:2,[[1,2],[2,3]]
返回值:1
输入:2,[[1,3],[2,4]]
返回值:2

复杂度要求:时间复杂度 O(nlogn) ,空间复杂度 O(n)

解题思路

方法一:循环遍历

对活动开始时间进行排序
对活动结束时间进行排序
starts[start] >= ends[end]时end++;
否则count++即需要增加一个主持人

class Solution {
public:
    int minmumNumberOfHost(int n, vector<vector<int> >& startEnd) {
        int len = startEnd.size();
        vector<int> starts(len);
        vector<int> ends(len);
        for(int i=0;i<len;i++){
            starts[i]= startEnd[i][0];
            ends[i]=startEnd[i][1];
        }
        sort(starts.begin(),starts.end());
        sort(ends.begin(),ends.end());
        int count=0,end=0;
        for(int start = 0;start<len;start++){
            if(starts[start]>=ends[end]) end++;
            else count++;
        }
        return count;
    }
};

方法二:按时刻统计活动数量

由题可知,活动数量只会在活动开始或者活动结束的时候变化。
所以我们只需要记录这些时刻活动数量的变化值,就可以通过累加得到活动数量的变化,进而求得活动数量的最大值。
时间复杂度:O(nlogn),空间复杂度O(n)
在这里插入图片描述

class Solution {
public:
    int minmumNumberOfHost(int n, vector<vector<int> >& startEnd) {
        map<int,int> counter;
        for(auto &v: startEnd){
            counter[v[0]]++;
            counter[v[1]]--;
        }
        int sum=0,result=0;
        for(auto &v: counter){
            sum+=v.second;
            result = max(sum,result);
        }
        return result;
    }
};
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值