题目描述:
有 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;
}
}