import java.util.*;
/**
* NC392 参加会议的最大数目
* @author d3y1
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param meetings int整型ArrayList<ArrayList<>>
* @return int整型
*/
public int attendmeetings (ArrayList<ArrayList<Integer>> meetings) {
// return solution1(meetings);
return solution2(meetings);
}
/**
* 贪心+排序: 直接排序会有问题!
* @param meetings
* @return
*/
private int solution1(ArrayList<ArrayList<Integer>> meetings){
Collections.sort(meetings, new Comparator<ArrayList<Integer>>(){
@Override
public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2){
if(o1.get(1).equals(o2.get(1))){
return o1.get(0)-o2.get(0);
}else{
return o1.get(1)-o2.get(1);
}
}
});
int result = 0;
int curDay = 0;
int start,end;
// 贪心
// 测试用例: [[1,3],[3,3],[2,4],[3,4]] [[1,3],[1,4],[2,3],[3,3]]
for(ArrayList<Integer> meeting: meetings){
start = meeting.get(0);
end = meeting.get(1);
if(start > end){
continue;
}
if(curDay <= end){
curDay = Math.max(curDay, start);
result++;
curDay++;
}
}
return result;
}
/**
* 贪心+最小堆+排序
* @param meetings
* @return
*/
private int solution2(ArrayList<ArrayList<Integer>> meetings){
int n = meetings.size();
// Collections.sort(meetings, (o1, o2) -> (o1.get(0)-o2.get(0)));
Collections.sort(meetings, Comparator.comparingInt(o -> o.get(0)));
PriorityQueue<Integer> minEndHeap = new PriorityQueue<>();
int result = 0;
// 当前天数
int curDay = meetings.get(0).get(0);
// 贪心
for(int i=0; i<n||!minEndHeap.isEmpty();){
// 会议入堆(按照开始时间判断)
while(i<n && meetings.get(i).get(0)==curDay){
// 结束时间入堆
minEndHeap.offer(meetings.get(i).get(1));
i++;
}
// 会议排除(按照结束时间)(过期)
while(!minEndHeap.isEmpty() && minEndHeap.peek()<curDay){
minEndHeap.poll();
}
// 会议选择(一天一个会议)
if(!minEndHeap.isEmpty()){
minEndHeap.poll();
result++;
}
curDay++;
}
return result;
}
}