/*
    按照 开始时间 对会议进行排序。

    初始化一个新的 最小堆,将第一个会议的结束时间加入到堆中。我们只需要记录会议的结束时间,告诉我们什么时候房间会空。
    对每个会议,检查堆的最小元素(即堆顶部的房间)是否空闲。
        若房间空闲,则从堆顶拿出该元素,将其改为我们处理的会议的结束时间,加回到堆中。
        若房间不空闲。开新房间,并加入到堆中。
    处理完所有会议后,堆的大小即为开的房间数量。这就是容纳这些会议需要的最小房间数。

    */
    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();
    }