Leetcode::Meeting Rooms iii (3)

point

Design

                while(!usedRooms.empty() && usedRooms.top().first == earliestEndTime) {
                    unUsed.push({usedRooms.top().second});
                    usedRooms.pop();
                }

Big O(time)

Code

// Understanding + Algorithm = 38m + 19m (coding)
class Solution {
public:
typedef long long ll;
vector<ll> usedCnt;
    int mostBooked(int n, vector<vector<int>>& meetings) {
        usedCnt = vector<ll>(n, 0);
        sort(meetings.begin(), meetings.end());
        priority_queue<ll, vector<ll>, greater<ll> > unUsed;
        priority_queue<pair<ll, ll>, vector<pair<ll, ll>>, greater<pair<ll, ll> > > usedRooms;
        // key = end time   (multiple),   value = room number

        for(int i = 0; i < n; i++) unUsed.push(i);

        for(auto meet : meetings) {
            ll st = meet.front(), en = meet.back();

            // 1. pull out if there exist meetings ended before 'st'
            
            while(!usedRooms.empty() && usedRooms.top().first <= st) {
                unUsed.push({usedRooms.top().second});
                usedRooms.pop();
            }
            // 2. If there's yes unused rooms left
            if (!unUsed.empty()) {
                // push
                ll roomNumber = unUsed.top();
                unUsed.pop();
                usedRooms.push({en, roomNumber});
                usedCnt[roomNumber]++;
            }
            // 3. If there's no unsued rooms left
            else {
                // pop from ongoing
                ll earliestEndTime = usedRooms.top().first;
                ll roomNumber = usedRooms.top().second;
                usedRooms.pop();
                usedRooms.push({earliestEndTime + (en - st), roomNumber});
                usedCnt[roomNumber]++;
            }
        }
        ll mxId = -1, mxCnt = 0;
        for(int i = 0; i < n; i++) {
            if (usedCnt[i] > mxCnt) {
                mxCnt = usedCnt[i];
                mxId = i;
            }
        }
        return mxId;
    }
};