题目
扫描线算法
这里需要遍历所有日期,题目中日期范围是1 <= events[i][0] <= events[i][1] <= 10^5,那么就遍历这些日期,逐个日期去判断当前日期是否可以参加会议。
public int maxEvents(int[][] events) {
int res=0,eventIndex=0,n=events.length;
Arrays.sort(events,(a,b)->a[0]==b[0]?a[1]-b[1]:a[0]-b[0]);
PriorityQueue<Integer> pq=new PriorityQueue<>();//存放endday
for(int i=1;i<=100000;++i){//遍历所有日期
if(eventIndex==n&&pq.isEmpty()) break;//已经没有可参加的会议
//当前日期恰好为某会议的startday
while(eventIndex<n&&events[eventIndex][0]==i) {
pq.offer(events[eventIndex][1]);
eventIndex++;
}
while(!pq.isEmpty()&&pq.peek()<i) pq.poll();//去除已经过期的会议
if(!pq.isEmpty()){//当前日期可以参加一个会议
pq.poll();
res++;
}
}
return res;
}