Off-by-one on range boundaries
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Move from brute-force thinking to an efficient approach using design strategy.
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 a SeatManager object that will manage n seats numbered from 1 to n. 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 given seatNumber.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 <= nreserve, it is guaranteed that there will be at least one unreserved seat.unreserve, it is guaranteed that seatNumber will be reserved.105 calls in total will be made to reserve and unreserve.Problem summary: 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 a SeatManager object that will manage n seats numbered from 1 to n. 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 given seatNumber.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Design
["SeatManager","reserve","reserve","unreserve","reserve","reserve","reserve","reserve","unreserve"] [[5],[],[],[2],[],[],[],[],[5]]
design-phone-directory)design-a-number-container-system)Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #1845: Seat Reservation Manager
class SeatManager {
private PriorityQueue<Integer> q = new PriorityQueue<>();
public SeatManager(int n) {
for (int i = 1; i <= n; ++i) {
q.offer(i);
}
}
public int reserve() {
return q.poll();
}
public void unreserve(int seatNumber) {
q.offer(seatNumber);
}
}
/**
* Your SeatManager object will be instantiated and called as such:
* SeatManager obj = new SeatManager(n);
* int param_1 = obj.reserve();
* obj.unreserve(seatNumber);
*/
// Accepted solution for LeetCode #1845: Seat Reservation Manager
type SeatManager struct {
q hp
}
func Constructor(n int) SeatManager {
q := hp{}
for i := 1; i <= n; i++ {
heap.Push(&q, i)
}
return SeatManager{q}
}
func (this *SeatManager) Reserve() int {
return heap.Pop(&this.q).(int)
}
func (this *SeatManager) Unreserve(seatNumber int) {
heap.Push(&this.q, seatNumber)
}
type hp struct{ sort.IntSlice }
func (h hp) Less(i, j int) bool { return h.IntSlice[i] < h.IntSlice[j] }
func (h *hp) Push(v any) { h.IntSlice = append(h.IntSlice, v.(int)) }
func (h *hp) Pop() any {
a := h.IntSlice
v := a[len(a)-1]
h.IntSlice = a[:len(a)-1]
return v
}
/**
* Your SeatManager object will be instantiated and called as such:
* obj := Constructor(n);
* param_1 := obj.Reserve();
* obj.Unreserve(seatNumber);
*/
# Accepted solution for LeetCode #1845: Seat Reservation Manager
class SeatManager:
def __init__(self, n: int):
self.q = list(range(1, n + 1))
def reserve(self) -> int:
return heappop(self.q)
def unreserve(self, seatNumber: int) -> None:
heappush(self.q, seatNumber)
# Your SeatManager object will be instantiated and called as such:
# obj = SeatManager(n)
# param_1 = obj.reserve()
# obj.unreserve(seatNumber)
// Accepted solution for LeetCode #1845: Seat Reservation Manager
/**
* [1845] Seat Reservation Manager
*
* 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 a SeatManager object that will manage n seats numbered from 1 to n. 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 given seatNumber.
*
*
* 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 <= 10^5
* 1 <= 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 that seatNumber will be reserved.
* At most 10^5 calls in total will be made to reserve and unreserve.
*
*/
pub struct Solution {}
// problem: https://leetcode.com/problems/seat-reservation-manager/
// discuss: https://leetcode.com/problems/seat-reservation-manager/discuss/?currentPage=1&orderBy=most_votes&query=
// submission codes start here
struct SeatManager {
hp: std::collections::BinaryHeap<i32>,
}
/**
* `&self` means the method takes an immutable reference.
* If you need a mutable reference, change it to `&mut self` instead.
*/
impl SeatManager {
fn new(n: i32) -> Self {
Self {
hp: std::collections::BinaryHeap::from((-n..=-1).collect::<Vec<i32>>()),
}
}
fn reserve(&mut self) -> i32 {
let i = self.hp.pop().unwrap();
-i
}
fn unreserve(&mut self, seat_number: i32) {
self.hp.push(-seat_number);
}
}
/**
* Your SeatManager object will be instantiated and called as such:
* let obj = SeatManager::new(n);
* let ret_1: i32 = obj.reserve();
* obj.unreserve(seatNumber);
*/
// submission codes end
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_1845_example_1() {
let mut seat_manager = SeatManager::new(5); // Initializes a SeatManager with 5 seats.
assert_eq!(seat_manager.reserve(), 1); // All seats are available, so return the lowest numbered seat, which is 1.
assert_eq!(seat_manager.reserve(), 2); // The available seats are [2,3,4,5], so return the lowest of them, which is 2.
seat_manager.unreserve(2); // Unreserve seat 2, so now the available seats are [2,3,4,5].
assert_eq!(seat_manager.reserve(), 2); // The available seats are [2,3,4,5], so return the lowest of them, which is 2.
assert_eq!(seat_manager.reserve(), 3); // The available seats are [3,4,5], so return the lowest of them, which is 3.
assert_eq!(seat_manager.reserve(), 4); // The available seats are [4,5], so return the lowest of them, which is 4.
assert_eq!(seat_manager.reserve(), 5); // The only available seat is seat 5, so return 5.
seat_manager.unreserve(5); // Unreserve seat 5, so now the available seats are [5].
}
}
// Accepted solution for LeetCode #1845: Seat Reservation Manager
class SeatManager {
private q = new MinPriorityQueue<number>();
constructor(n: number) {
for (let i = 1; i <= n; i++) {
this.q.enqueue(i);
}
}
reserve(): number {
return this.q.dequeue();
}
unreserve(seatNumber: number): void {
this.q.enqueue(seatNumber);
}
}
/**
* Your SeatManager object will be instantiated and called as such:
* var obj = new SeatManager(n)
* var param_1 = obj.reserve()
* obj.unreserve(seatNumber)
*/
Use this to step through a reusable interview workflow for this problem.
Use a simple list or array for storage. Each operation (get, put, remove) requires a linear scan to find the target element — O(n) per operation. Space is O(n) to store the data. The linear search makes this impractical for frequent operations.
Design problems target O(1) amortized per operation by combining data structures (hash map + doubly-linked list for LRU, stack + min-tracking for MinStack). Space is always at least O(n) to store the data. The challenge is achieving constant-time operations through clever structure composition.
Review these before coding to avoid predictable interview regressions.
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.