BM96 主持人调度(二)

题目描述:
有 n 个活动即将举办,每个活动都有开始时间与活动的结束时间,第 i 个活动的开始时间是 s t a r t start start i i i,第 i 个活动的结束时间是 e n d end end i i i,举办某个活动就需要为该活动准备一个活动主持人。
一位活动主持人在同一时间只能参与一个活动。并且活动主持人需要全程参与活动,换句话说,一个主持人参与了第 i 个活动,那么该主持人在 ( s t a r t start start i i i, e n d end end i i i) 这个时间段不能参与其他任何活动。求为了成功举办这 n 个活动,最少需要多少名主持人。
数据范围: 1 <= n <= 10^5
-2^32 <= s t a r t start start i i i <= e n d end end i i i <= 2^31-1

public class Solution {
    // 有 n 个活动,startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间
    public int minmumNumberOfHost (int n, int[][] startEnd) {
        /* 等价于最大重叠区间问题,也就是求最多线段重合的部分有多少条线段 */
        
        // 按照区间的开始时间进行排序
        Arrays.sort(startEnd, (a, b) -> {
            return a[0] > b[0] ? 1 : -1;
        });
        // 只存放区间的结束时间
        PriorityQueue<Integer> queue = new PriorityQueue<>();
        /* 比如:[1,5] [2,6] [2,4] [5,9] 
           第一个线段的开始位置是 1,此时把堆中所有小于等于 1 的数字全部弹出,然后放入结束位置 5,此时堆的大小就是答案,此时是 1
           第二个线段的开始位置是 2,此时把堆中所有小于等于 2 的数字全部弹出,然后放入结束位置 6,此时堆的大小就是答案,此时是 2
           第三个线段的开始位置是 2,此时把堆中所有小于等于 2 的数字全部弹出,然后放入结束位置 4,此时堆的大小就是答案,此时是 3
           第四个线段的开始位置是 5,此时把堆中所有小于等于 5 的数字全部弹出,然后放入结束位置 9,此时堆的大小就是答案,此时是 2
           所有答案中的最大值就是最终的结果
        */
        int res = 0;
        for(int i = 0; i < n; i++){
            while(!queue.isEmpty() && queue.peek() <= startEnd[i][0]){
                queue.poll();
            }
            queue.add(startEnd[i][1]);
            res = Math.max(res, queue.size());
        }
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静波波呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值