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() {
@Override
public int compare(int[] o1, int[] o2) {
return Integer.compare(o1[0], o2[0]);
}
});
int ans = 0;
PriorityQueue 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> in = new HashMap<>();
Map> 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 treeSet = new TreeSet<>(new Comparator() {
@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;
}
}