链接:https://leetcode-cn.com/problems/maximum-number-of-events-that-can-be-attended/
思路:按照开始时间排序,然后从第一天开始循环遍历,把开始时间小于等于nowDay的结束时间放入优先队列中(小于等于nowDay说明有机会参加但是不一定能参加),优先队列是一个小顶堆,最上面是结束时间最早的那个,然后poll掉这个result++,最后天数后移一天nowDay++
上代码:
java实现:
class Solution {
public int maxEvents(int[][] events) {
Arrays.sort(events, Comparator.comparing(x -> x[0]));
PriorityQueue<Integer> pQ = new PriorityQueue<>();
int result = 0, nowDay = 1, i = 0;
while (i < events.length || !pQ.isEmpty()) {
while (!pQ.isEmpty() && pQ.peek() < nowDay) {
pQ.poll();
}
while (i < events.length && events[i][0] <= nowDay){
pQ.add(events[i++][1]);
}
if(!pQ.isEmpty()){
pQ.poll();
result++;
}
nowDay++;
}
return result;
}
}
kotlin实现:
class Solution {
fun maxEvents(events: Array<IntArray>): Int {
events.sortBy { it[0] }
val pQ = PriorityQueue<Int>()
var result = 0
var nowDay = 1
var i = 0
while (i < events.size || !pQ.isEmpty()){
while (!pQ.isEmpty() && pQ.peek() < nowDay){
pQ.poll()
}
while (i < events.size && events[i][0] <= nowDay ){
pQ.add(events[i++][1])
}
if(!pQ.isEmpty()){
pQ.poll()
result++
}
nowDay++
}
return result
}
}