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