题意整理
- 有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数组,所以空间复杂度为。