贪心-最大相容区间-Maximum Number of Events That Can Be Attended

2020-02-16 16:24:19

问题描述:

问题求解:

看起来就像是sort + 贪心,但是具体如何做呢?

实际上本题是最大相容区间的变种题,在最大相容区间里,我们按照结束时间对interval进行排序,每次选择结束时间最早的进行安排。

这里其实也是一样,对每一天,我们在当天所有的events里挑选结束时间最早的进行安排即可。

如何维护当天所有的events呢?最常见的就是使用优先队列啦。

其实,就是扫描线算法。

public int maxEvents(int[][] events) {
        int res = 0;
        PriorityQueue<int[]> pq = new PriorityQueue<>((int[] o1, int[] o2) -> o1[1] == o2[1] ? o1[0] - o2[0] : o1[1] - o2[1]);
        Arrays.sort(events, (int[] o1, int[] o2) -> o1[0] - o2[0]);
        int idx = 0;
        for (int day = 1; day <= 100000; day++) {
            while (idx < events.length && events[idx][0] == day) {
                pq.add(events[idx++]);
            }
            while (!pq.isEmpty() && pq.peek()[1] < day) pq.poll();
            if (!pq.isEmpty()) {
                pq.poll();
                res += 1;
            }
        }
        return res;
    }

  

 

posted @ 2020-02-16 16:29  hyserendipity  阅读(667)  评论(0编辑  收藏  举报