/*
按照 开始时间 对会议进行排序。
初始化一个新的 最小堆,将第一个会议的结束时间加入到堆中。我们只需要记录会议的结束时间,告诉我们什么时候房间会空。
对每个会议,检查堆的最小元素(即堆顶部的房间)是否空闲。
若房间空闲,则从堆顶拿出该元素,将其改为我们处理的会议的结束时间,加回到堆中。
若房间不空闲。开新房间,并加入到堆中。
处理完所有会议后,堆的大小即为开的房间数量。这就是容纳这些会议需要的最小房间数。
*/
public int minmumNumberOfHost (int n, int[][] startEnd) {
// write code here
if(startEnd == null || startEnd.length == 0) return 0;
Arrays.sort(startEnd, (o1,o2)->{
if(o1[0] == o2[0]) return o1[1] - o2[1];
return o1[0] - o2[0];
});
PriorityQueue<Integer> minQ = new PriorityQueue<Integer>(startEnd.length,(o1,o2)->{
return o1-o2;
});
minQ.add(startEnd[0][1]);
for(int i = 1; i < startEnd.length ; i ++){
if(startEnd[i][0] >= minQ.peek())
minQ.poll();
minQ.offer(startEnd[i][1]);
}
return minQ.size();
}