题解 | #参加会议的最大数目#
参加会议的最大数目
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; } }
解题思想:排序+小顶堆
#算法##算法笔记#