import java.util.*;
/**
* NC147 主持人调度(二)
* @author d3y1
*/
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) {
// return solution1(n, startEnd);
// return solution2(n, startEnd);
return solution3(n, startEnd);
}
/**
* 数组排序+小根堆+队列
* @param n
* @param startEnd
* @return
*/
private int solution1(int n, int[][] startEnd){
// 测试用例溢出: 10,[[2147483646,2147483647],[-2147483648,-2147483647],[2147483646,2147483647],[-2147483648,-2147483647],[2147483646,2147483647],[-2147483648,-2147483647],[2147483646,2147483647],[-2147483648,-2147483647],[2147483646,2147483647],[-2147483648,-2147483647]]
// Arrays.sort(startEnd, (o1, o2) -> {
// if(o1[0] == o2[0]){
// return o1[1]-o2[1];
// }else{
// return o1[0]-o2[0];
// }
// });
Arrays.sort(startEnd, (o1, o2) -> {
if(o1[0] == o2[0]){
if(o1[1] > o2[1]){
return 1;
}else if(o1[1] < o2[1]){
return -1;
}else{
return 0;
}
}else{
if(o1[0] > o2[0]){
return 1;
}else{
return -1;
}
}
});
Queue<Host> freeList = new LinkedList<>();
PriorityQueue<Host> workHeap = new PriorityQueue<>(Comparator.comparing(o -> o.endTime));
int result = 0;
int curTime,start,end;
Host host;
for(int[] act: startEnd){
start = act[0];
end = act[1];
curTime = start;
while(!workHeap.isEmpty() && workHeap.peek().endTime<=curTime){
freeList.offer(workHeap.poll());
}
if(!freeList.isEmpty()){
host = freeList.poll();
host.endTime = end;
workHeap.offer(host);
}else{
host = new Host(System.currentTimeMillis(), end);
workHeap.offer(host);
result = Math.max(result, workHeap.size());
}
}
return result;
}
/**
* 小根堆+队列
* @param n
* @param startEnd
* @return
*/
private int solution2(int n, int[][] startEnd){
PriorityQueue<Act> actHeap = new PriorityQueue<>((o1, o2) -> {
if(o1.start == o2.start){
if(o1.end > o2.end){
return 1;
}else if(o1.end < o2.end){
return -1;
}else{
return 0;
}
}else{
if(o1.start > o2.start){
return 1;
}else{
return -1;
}
}
});
for(int[] act: startEnd){
actHeap.offer(new Act(act[0], act[1]));
}
Queue<Host> freeList = new LinkedList<>();
PriorityQueue<Host> workHeap = new PriorityQueue<>(Comparator.comparing(o -> o.endTime));
int result = 0;
long curTime,start,end;
Act act;
Host host;
while(!actHeap.isEmpty()){
act = actHeap.poll();
start = act.start;
end = act.end;
curTime = start;
while(!workHeap.isEmpty() && workHeap.peek().endTime<=curTime){
freeList.offer(workHeap.poll());
}
if(!freeList.isEmpty()){
host = freeList.poll();
host.endTime = end;
workHeap.offer(host);
}else{
host = new Host(System.currentTimeMillis(), end);
workHeap.offer(host);
result = Math.max(result, workHeap.size());
}
}
return result;
}
/**
* 小根堆
* @param n
* @param startEnd
* @return
*/
private int solution3(int n, int[][] startEnd){
PriorityQueue<Act> actHeap = new PriorityQueue<>((o1, o2) -> {
if(o1.start == o2.start){
if(o1.end > o2.end){
return 1;
}else if(o1.end < o2.end){
return -1;
}else{
return 0;
}
}else{
if(o1.start > o2.start){
return 1;
}else{
return -1;
}
}
});
for(int[] act: startEnd){
actHeap.offer(new Act(act[0], act[1]));
}
PriorityQueue<Long> workHeap = new PriorityQueue<>();
long curTime,start,end;
Act act;
while(!actHeap.isEmpty()){
act = actHeap.poll();
start = act.start;
end = act.end;
curTime = start;
if(workHeap.isEmpty()){
workHeap.offer(end);
}else{
if(workHeap.peek() <= curTime){
workHeap.poll();
}
workHeap.offer(end);
}
}
return workHeap.size();
}
/**
* 主持人
*/
private class Host {
private long id;
private long endTime;
private Host(long id, long endTime){
this.id = id;
this.endTime = endTime;
}
}
/**
* 活动
*/
private class Act {
private long start;
private long end;
private Act(long start, long end){
this.start = start;
this.end = end;
}
}
}