返回介绍

solution / 1800-1899 / 1845.Seat Reservation Manager / README_EN

发布于 2024-06-17 01:03:14 字数 6643 浏览 0 评论 0 收藏 0

1845. Seat Reservation Manager

中文文档

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 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 <= 105
  • 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 105 calls in total will be made to reserve and unreserve.

Solutions

Solution 1: Priority Queue (Min Heap)

We can use a priority queue (min heap) to maintain the smallest number of reservable seats.

Initially, put all seat numbers into the priority queue.

When the reserve method is called, take out the smallest number from the priority queue, which is the smallest number of reservable seats.

When the unreserve method is called, put the seat number back into the priority queue.

The time complexity is $O(n \times \log n)$, and the space complexity is $O(n)$. Where $n$ is the number of seats.

class SeatManager:
  def __init__(self, n: int):
    self.q = list(range(1, n + 1))
    heapify(self.q)

  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)
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);
 */
class SeatManager {
public:
  SeatManager(int n) {
    for (int i = 1; i <= n; ++i) {
      q.push(i);
    }
  }

  int reserve() {
    int seat = q.top();
    q.pop();
    return seat;
  }

  void unreserve(int seatNumber) {
    q.push(seatNumber);
  }

private:
  priority_queue<int, vector<int>, greater<int>> q;
};

/**
 * Your SeatManager object will be instantiated and called as such:
 * SeatManager* obj = new SeatManager(n);
 * int param_1 = obj->reserve();
 * obj->unreserve(seatNumber);
 */
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);
 */
public class SeatManager {
  private SortedSet<int> availableSeats;

  public SeatManager(int n) {
    availableSeats = new SortedSet<int>();
    for (int i = 1; i <= n; i++) {
      availableSeats.Add(i);
    }
  }

  public int Reserve() {
    int reservedSeat = availableSeats.Min;
    availableSeats.Remove(reservedSeat);
    return reservedSeat;
  }

  public void Unreserve(int seatNumber) {
    availableSeats.Add(seatNumber);
  }
}

/**
 * Your SeatManager object will be instantiated and called as such:
 * SeatManager obj = new SeatManager(n);
 * int param_1 = obj.Reserve();
 * obj.Unreserve(seatNumber);
 */

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文