题解 | #参加会议的最大数目#
参加会议的最大数目
https://www.nowcoder.com/practice/4d3151698e33454f98bce1284e553651
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param meetings int整型ArrayList<ArrayList<>>
* @return int整型
*/
public int attendmeetings (ArrayList<ArrayList<Integer>> meetings) {
// write code here
// write code here
// 按照开始时间排序--升序
Collections.sort(meetings, new Comparator<ArrayList<Integer>>() {
@Override
public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
return o1.get(0) - o2.get(0);
}
});
// 记录参与的会议数量
int res = 0;
//表示当前第几个会议
int curIndex = 0;
//当前处于第几天,开始是第一个会议的开始时间
int curDay = meetings.get(0).get(0);
// 小顶堆
PriorityQueue<Integer> pq = new PriorityQueue<>();
// 扫描当前会议,或者小顶堆不为空
while(curIndex < meetings.size() || !pq.isEmpty()) {
//加入已经开始的会议--还未扫描到最后,且扫描的当前会议的开始时间和前面一致
while(curIndex < meetings.size() && meetings.get(curIndex).get(0) == curDay){
// 把结束时间加入小顶堆
pq.offer(meetings.get(curIndex).get(1));
curIndex++;
}
//剔除已经结束的会议
while(!pq.isEmpty() && pq.peek() < curDay){
//此时优先级队列的顶部存放的是结束时间最短的会议
pq.poll();
}
//找出结束时间最短的会议来参加
while(!pq.isEmpty()) {
pq.poll();
res++;
break;
}
curDay++;
}
//System.out.println(Arrays.toString(events));
return res;
}
}
解题思想:排序+小顶堆
#算法##算法笔记#
传音控股公司福利 325人发布