1.题目
2.解法
1、先按照startDay进行排序,得到开始时间从早到晚的数组排列。
2、接着将startDay相等的会议加入优先队列,弹出结束时间最早的会议。相同时间,结束时间最早的会议优先出列。
class Solution {
public int maxEvents(int[][] events) {
// 按照开始时间对元素排序
Arrays.sort(events, new Comparator<int[]>(){
@Override
public int compare(int[] a, int[] b) {
return a[0] - b[0];
}
});
PriorityQueue<Integer> queue = new PriorityQueue<>();
int day = 0, id = 0, n = events.length, res = 0;
while (id < n || !queue.isEmpty()) {
if (queue.isEmpty()) {
// day是由第一个值决定的
queue.add(events[id][1]);
day = events[id++][0];
}
// 将dayday中否合要求的值添加进去
while (id < n && events[id][0] <= day) {
queue.add(events[id++][1]);
}
// 否合要求,day和res都会++,既然最大值都大于等于day,那么第一个元素就可以poll
// day++,是因为一天只能参加1场会议
if (queue.peek() >= day) {
day++;
res++;
}
// 不符合要求的元素要poll出去,要不循环结束不了
queue.poll();
}
return res;
}
}
每次一个结束时间仅进出堆一次,加上堆排序的时间和维护堆的时间,时间复杂度为O(nlogn),空间复杂度为O(n)
优先队列由堆来实现。