题目 https://leetcode.cn/problems/maximum-number-of-events-that-can-be-attended/
贪心算法 https://youtu.be/9bJvSySPcZM
在有多个会议已解锁时,贪心算法选择结束时间最早的那个去参加。
具体算法怎么做?首先将会议按起始时间排序。遍历每一天:
- 将新解锁的会议加入优先队列,后者按会议结束时间排序。
- 然后将过期的会议去除。
- 最后取出一个活跃会议去参与。
class Solution {
public int maxEvents(int[][] events) {
List<int[]> meetings = new ArrayList<>();
for (int i = 0; i < events.length; i++) {
meetings.add(new int[]{events[i][0], events[i][1]});
}
Collections.sort(meetings, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
int res = 0;
int i = 0;
PriorityQueue<Integer> readyList = new PriorityQueue<>();
for (int day = 1; day <= 100000; day++) {
while(i < meetings.size() && meetings.get(i)[0] <= day) {
readyList.add(meetings.get(i)[1]);
i++;
}
while (!readyList.isEmpty() && readyList.peek() < day) {
readyList.poll();
}
if (!readyList.isEmpty()) {
readyList.poll();
res++;
}
}
return res;
}
}