解法1:优先级队列
首先:要对活动进行排序:
- 开始时间相等的,结束时间从小到大
- 开始时间不相等的,开始时间从小到大
其次:建立一个优先级队列:默认升序,同时处理活动
- 只提供结束时间,如果当前的开始时间小于队首的结束时间,说明没空闲
- 如果当前的开始时间大于队首的结束时间,说明可以空闲一个,队首出队
最后返回队列长度
import java.util.*;
public class Solution {
public int minmumNumberOfHost (int n, int[][] startEnd) {
// 排序,头相等的,尾从小到大
// 头不相等的头从小到大
Arrays.sort(startEnd,new Comparator<int[]>(){
public int compare(int[] arr1,int[] arr2){
if(arr1[0] == arr2[0]){
return arr1[1] - arr2[1];
}
return arr1[0] - arr2[0];
}
});
// 默认升序
int min=Integer.MIN_VALUE;
PriorityQueue<Integer> queue = new PriorityQueue<Integer>();
queue.offer(min);
for(int i = 0;i < n;i++){
// 只提供结束时间,如果当前的开始时间小于队首的结束时间,说明没空闲
// 如果当前的开始时间大于队首的结束时间,说明可以空闲一个,队首出队
if(queue.peek() <= startEnd[i][0]) {
queue.poll();
}
queue.offer(startEnd[i][1]);
}
return queue.size();
}
}解法2:循环遍历
对活动开始时间进行排序
对活动结束时间进行排序
starts[start] >= ends[end]时end++;
否则count++即需要增加一个主持人
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) {
// write code here
int[] starts = new int[startEnd.length];
int[] ends = new int[startEnd.length];
for(int i = 0 ;i < startEnd.length;i++){
starts[i] = startEnd[i][0];
ends[i] = startEnd[i][1];
}
Arrays.sort(starts);
Arrays.sort(ends);
int count = 0;
int end = 0;
for(int start = 0;start< startEnd.length;start++){
if(starts[start] >= ends[end]){
end++;
}else{
count++;
}
}
return count;
}
}
京公网安备 11010502036488号