1. 题目 2. 题解 (1)优先队列 优先队列用来存放数组。[0]为离开时间。[1]为座位号码times排序curNum 保存当前座位最小值 class Solution { public int smallestChair(int[][] times, int targetFriend) { int targetStart = times[targetFriend][0]; //targetFriend的到达时间 Arrays.sort(times, (a, b) -> a[0] - b[0]); //按照到达时间进行排序 //优先队列用来存放数组。[0]为离开时间。[1]为座位号码 PriorityQueue<int[]> queue = new PriorityQueue(new Comparator(){ public int compare(Object o1, Object o2){ return ((int[]) o1)[0] - ((int[]) o2)[0]; //按照离开时间进行排序,维持升序 } }); int curNum = 0; //当前最小值 //set用来维护已经占用的座位。 HashSet<Integer> set = new HashSet<>(); for(int i = 0; i < times.length; i++){ //判断是否应该更新当前最小值,当前是否有椅子置空, <=都置空 while(!queue.isEmpty() && queue.peek()[0] <= times[i][0]){ int l1 = queue.poll()[1]; //获取置空座位号 curNum = Math.min(curNum, l1); //更新空座位 set.remove(l1); //更新最小座位号 } //选取当前最小座位 while(set.contains(curNum)) curNum++; //满足条件直接返回 if(times[i][0] == targetStart) return curNum; //队列为空直接。当前最小值设置为0 if(queue.isEmpty()) curNum = 0; set.add(curNum); queue.add(new int[]{times[i][1], curNum}); curNum++; } return 0; } }