Meeting Rooms III
HardArrayHash TableSortingHeap (Priority Queue)Simulation
Solution
import { Heap } from '@algorithm/lib';
export function mostBooked(n: number, meetings: number[][]): number {
function sortFn<T extends number | number[]>(a: T, b: T): number {
if (typeof a === 'number' && typeof b === 'number') {
return a - b;
}
if (Array.isArray(a) && Array.isArray(b)) {
for (let i = 0; i < Math.min(a.length, b.length); i++) {
if (a[i] !== b[i]) {
return a[i] - b[i];
}
}
return a.length - b.length;
}
return 0;
}
meetings.sort(sortFn);
const availables = new Heap<number>(sortFn);
const reservations = new Heap<[number, number]>(sortFn);
for (let i = 0; i < n; i++) {
availables.push(i);
}
const bookedCount = new Array<number>(n).fill(0);
for (const [start, end] of meetings) {
while (0 < reservations.length && reservations.peek![0] <= start) {
const [, room] = reservations.pop()!;
availables.push(room);
}
if (0 < availables.length) {
const room = availables.pop()!;
reservations.push([end, room]);
bookedCount[room] += 1;
} else {
const [time, room] = reservations.pop()!;
reservations.push([time + end - start, room]);
bookedCount[room] += 1;
}
}
return bookedCount.indexOf(Math.max(...bookedCount));
}