package com.zhang.reflection.面试.算法模版.贪心算法;
import java.util.ArrayList;
import java.util.Collections;
import java.util.PriorityQueue;
/**牛客 NC392
* 给定一个闭区间列表 meetings ,其中 meetings_i = [starts_i,end_i]
* 结束,你可以在这个区间的任意一天中参加这个会议,但是你一天只能参加一个会议。
* 请你算出你最多可以参加多少个会议。
* [[5,9],[16,8],[6,40],[17,50],[13,19],[15,7],[21,32],[10,3],[1,2],[27,18]]
* 6
*/
public class 参加会议最大数目 {
public int attendmeetings (ArrayList<ArrayList<Integer>> meetings) {
// write code here
Collections.sort(meetings, (a, b) -> {
return a.get(0) != b.get(0)?a.get(0)-b.get(0):a.get(1)-b.get(1);
});
PriorityQueue<Integer> queue = new PriorityQueue<>();
int i = 0;
int day = 1;
int res = 0;
while (i < meetings.size() || !queue.isEmpty()) {
// 将day天能参加的会议全部加入到优先队列,按照结束时间排序
while (i < meetings.size() && meetings.get(i).get(0) == day) {
queue.add(meetings.get(i).get(1));
i++;
}
// 将已经结束的会议全部删掉
while (!queue.isEmpty() && queue.peek() < day) {
queue.poll();
}
// 一天只能参加一场会议将结束时间最早的安排了
if (!queue.isEmpty()) {
queue.poll();
res++;
}
// 安排下一天
day++;
}
return res;
}
}