1353. 最多可以参加的会议数目

给你一个数组 events,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 endDayi 。

你可以在满足 startDayi <= d <= endDayi 中的任意一天 d 参加会议 i 。注意,一天只能参加一个会议。

请你返回你可以参加的 最大 会议数目。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-number-of-events-that-can-be-attended
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

排序 + 堆

import java.util.*;

class Solution {

    public int maxEvents(int[][] events) {
        Arrays.sort(events, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return Integer.compare(o1[0], o2[0]);
            }
        });
        int ans = 0;
        PriorityQueue<Integer> queue = new PriorityQueue<>();
        int index = 0;
        int day = 1;
        while (index < events.length || !queue.isEmpty()) {
            while (index < events.length && events[index][0] == day) {
                queue.offer(events[index++][1]);
            }
            while (!queue.isEmpty() && queue.peek() < day) {
                queue.poll();
            }
            if (!queue.isEmpty()) {
                ans++;
                queue.poll();
            }
            day++;
        }
        return ans;
    }
}

import java.util.*;

class Solution {

    public int maxEvents(int[][] events) {
        Map<Integer, List<Integer>> in = new HashMap<>();
        Map<Integer, List<Integer>> out = new HashMap<>();
        int maxDay = 1;
        for (int i = 0; i < events.length; ++i) {
            maxDay = Math.max(maxDay, events[i][1]);
            in.computeIfAbsent(events[i][0], k -> new ArrayList<>()).add(i);
            out.computeIfAbsent(events[i][1], k -> new ArrayList<>()).add(i);
        }

        int ans = 0;

        TreeSet<Integer> treeSet = new TreeSet<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                if (events[o1][1] == events[o2][1]) {
                    return Integer.compare(o1, o2);
                }
                return Integer.compare(events[o1][1], events[o2][1]);
            }
        });

        for (int day = 1; day <= maxDay; ++day) {
            treeSet.addAll(in.getOrDefault(day, Collections.emptyList()));
            if (!treeSet.isEmpty()) {
                treeSet.pollFirst();
                ans++;
            }
            out.getOrDefault(day, Collections.emptyList()).forEach(treeSet::remove);
        }

        return ans;
    }
}
posted @ 2022-01-22 12:15  Tianyiya  阅读(49)  评论(0)    收藏  举报