2402 Meeting room III
https://leetcode.com/problems/meeting-rooms-iii/
ๅ ถๅฎunscheMeetingๅช้่ฆๆๅsortr็ถๅ้ๅ๏ผไธ้่ฆๆพๅจpq้
class Solution {
class Meeting {
public long start;
public long end;
public int room;
public Meeting(long s, long e, int r) {
this.start = s;
this.end = e;
this.room = r;
}
}
public int mostBooked(int n, int[][] meetings) {
int[] rooms = new int[n];
PriorityQueue<Integer> availRooms = new PriorityQueue<>();
PriorityQueue<Meeting> scheMeetings = new PriorityQueue<>(new Comparator<Meeting>(){
@Override
public int compare(Meeting m1, Meeting m2) {
// if end time is the same, return the smallest room first
if (m1.end == m2.end) {
return Integer.compare(m1.room, m2.room);
}
return m1.end < m2.end ? -1 : 1;
}
});
PriorityQueue<Meeting> unscheMeetings = new PriorityQueue<>(new Comparator<Meeting>(){
@Override
public int compare(Meeting m1, Meeting m2) {
return m1.start < m2.start ? -1 : 1;
}
});
for (int r = 0; r < n; r++) {
availRooms.offer(r);
}
for (int i = 0; i < meetings.length; i++) {
unscheMeetings.offer(new Meeting(meetings[i][0], meetings[i][1], 0));
}
while (!unscheMeetings.isEmpty()) {
// update available rooms by the time this meeting should have started
while (!scheMeetings.isEmpty() && unscheMeetings.peek().start >= scheMeetings.peek().end) {
availRooms.offer(scheMeetings.poll().room);
}
if (!availRooms.isEmpty()) {
int r = availRooms.poll();
rooms[r]++;
Meeting m = unscheMeetings.poll();
m.room = r;
scheMeetings.offer(m);
} else {
Meeting om = scheMeetings.poll();
Meeting nm = unscheMeetings.poll();
nm.end += (om.end - nm.start);
nm.start = om.end;
nm.room = om.room;
rooms[nm.room]++;
scheMeetings.offer(nm);
}
}
int res = 0;
int idx = 0;
for (int i = 0; i < rooms.length; i++) {
if (res < rooms[i]) {
res = rooms[i];
idx = i;
}
}
return idx;
}
}
Last updated