1845. Seat Reservation Manager
SourceBiweekly Contest 51 Q2DifficultyMediumRating1428
Description
Design a system that manages the reservation state of n seats that are numbered from 1 to n.
Implement the SeatManager class:
SeatManager(int n)Initializes aSeatManagerobject that will managenseats numbered from1ton. All seats are initially available.int reserve()Fetches the smallest-numbered unreserved seat, reserves it, and returns its number.void unreserve(int seatNumber)Unreserves the seat with the givenseatNumber.
Example 1:
Input ["SeatManager", "reserve", "reserve", "unreserve", "reserve", "reserve", "reserve", "reserve", "unreserve"] [[5], [], [], [2], [], [], [], [], [5]] Output [null, 1, 2, null, 2, 3, 4, 5, null] Explanation SeatManager seatManager = new SeatManager(5); // Initializes a SeatManager with 5 seats. seatManager.reserve(); // All seats are available, so return the lowest numbered seat, which is 1. seatManager.reserve(); // The available seats are [2,3,4,5], so return the lowest of them, which is 2. seatManager.unreserve(2); // Unreserve seat 2, so now the available seats are [2,3,4,5]. seatManager.reserve(); // The available seats are [2,3,4,5], so return the lowest of them, which is 2. seatManager.reserve(); // The available seats are [3,4,5], so return the lowest of them, which is 3. seatManager.reserve(); // The available seats are [4,5], so return the lowest of them, which is 4. seatManager.reserve(); // The only available seat is seat 5, so return 5. seatManager.unreserve(5); // Unreserve seat 5, so now the available seats are [5].
Constraints:
1 <= n <= 1051 <= seatNumber <= n- For each call to
reserve, it is guaranteed that there will be at least one unreserved seat. - For each call to
unreserve, it is guaranteed thatseatNumberwill be reserved. - At most
105calls in total will be made toreserveandunreserve.
Solutions
Solution 1: Priority Queue (Min-Heap)
Thinking
We must always reserve the smallest free seat and later release seats. Scanning a boolean array for the minimum free index is \(O(n)\) per call.
Store free seat numbers in a min-heap: \(\textit{reserve}\) pops the top, \(\textit{unreserve}\) pushes the number back. Both updates are logarithmic.
We define a priority queue (min-heap) \(q\) to store all the available seat numbers. Initially, we add all seat numbers from \(1\) to \(n\) into \(q\).
When calling the \(\textit{reserve}\) method, we pop the top element from \(q\), which is the smallest available seat number.
When calling the \(\textit{unreserve}\) method, we add the seat number back into \(q\).
In terms of time complexity, the initialization time complexity is \(O(n)\) or \(O(n \log n)\), and the time complexity of the \(\textit{reserve}\) and \(\textit{unreserve}\) methods is both \(O(\log n)\). The space complexity is \(O(n)\).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |