You are given an integer n. There are n rooms numbered from 0 to n - 1.
You are given a 2D integer array meetings where meetings[i] = [starti, endi] means that a meeting will be held during the half-closed time interval [starti, endi). All the values of starti are unique.
Meetings are allocated to rooms in the following manner:
Return the number of the room that held the most meetings. If there are multiple rooms, return the room with the lowest number.
A half-closed interval [a, b) is the interval between a and b including a and not including b.
Example 1:
Input: n = 2, meetings = [[0,10],[1,5],[2,7],[3,4]] Output: 0 Explanation: - At time 0, both rooms are not being used. The first meeting starts in room 0. - At time 1, only room 1 is not being used. The second meeting starts in room 1. - At time 2, both rooms are being used. The third meeting is delayed. - At time 3, both rooms are being used. The fourth meeting is delayed. - At time 5, the meeting in room 1 finishes. The third meeting starts in room 1 for the time period [5,10). - At time 10, the meetings in both rooms finish. The fourth meeting starts in room 0 for the time period [10,11). Both rooms 0 and 1 held 2 meetings, so we return 0.
Example 2:
Input: n = 3, meetings = [[1,20],[2,10],[3,5],[4,9],[6,8]] Output: 1 Explanation: - At time 1, all three rooms are not being used. The first meeting starts in room 0. - At time 2, rooms 1 and 2 are not being used. The second meeting starts in room 1. - At time 3, only room 2 is not being used. The third meeting starts in room 2. - At time 4, all three rooms are being used. The fourth meeting is delayed. - At time 5, the meeting in room 2 finishes. The fourth meeting starts in room 2 for the time period [5,10). - At time 6, all three rooms are being used. The fifth meeting is delayed. - At time 10, the meetings in rooms 1 and 2 finish. The fifth meeting starts in room 1 for the time period [10,12). Room 0 held 1 meeting while rooms 1 and 2 each held 2 meetings, so we return 1.
Constraints:
1 <= n <= 1001 <= meetings.length <= 105meetings[i].length == 20 <= starti < endi <= 5 * 105starti are unique.class Solution {
public int mostBooked(int n, int[][] meetings) {
int[] meetCt = new int[n];
Queue<Integer> free = new PriorityQueue<>(IntStream.range(0, n).boxed().toList());
Queue<long[]> used = new PriorityQueue<>((a, b) -> a[0] != b[0] ?
Long.compare(a[0], b[0]) : Long.compare(a[1], b[1])); // {meetEndTime, roomNo.}
// Arrays.sort(meetings, (a, b) -> a[0] != b[0] ? Integer.compare(a[0], b[0]) : Integer.compare(a[1], b[1]));
for (int[] m : meetings) {
while (!used.isEmpty() && used.peek()[0] <= m[0])
free.add((int)used.poll()[1]);
if (!free.isEmpty()) {
used.add(new long[]{m[1], free.peek()}); // {meetEndTime, roomNo.}
meetCt[free.poll()]++;
} else {
used.add(new long[]{used.peek()[0] + m[1] - m[0], used.peek()[1]});
meetCt[(int)used.poll()[1]]++;
}
// System.out.println(free.toString());
// System.out.println(used.toString());
}
int maxMeetCt = Integer.MIN_VALUE, ans=-1;
for (int i = 0; i < n; i++) {
if (meetCt[i] > maxMeetCt) {
maxMeetCt = meetCt[i];
ans = i;
}
}
return ans;
}
}