Bài toán

Link đến bài toán: 1535. Find the Winner of an Array Game

Phân tích

Bài hôm nay khá dễ.

Ta cần tìm một cấu trúc dữ liệu cho phép ta truy cập vào phần tử nhỏ nhất với độ phức tạp là O(1).

=> có thể dùng một min heap để giải quyết bài này.

Ta có thể push tất cả các số từ 1 đến n vào min heap, khi reserve thì ta pop ra một phần tử nhỏ nhất, khi unreserve thì ta push lại phần tử đó vào min heap.

Có thể optimize hơn bằng cách dùng một idx để lưu giá trị nhỏ nhất hiện tại, khi reserve thì ta pop ra phần tử nhỏ nhất, hoặc idx nếu min heap rỗng.

Giải thuật

type Heap []int

func (h Heap) Len() int           { return len(h) }
func (h Heap) Less(i, j int) bool { return h[i] < h[j] }
func (h Heap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }

func (h *Heap) Push(x interface{}) {
*h = append(*h, x.(int))
}

func (h *Heap) Pop() interface{} {
old := *h
n := len(old)
x := old[n-1]
*h = old[0 : n-1]
return x
}


type SeatManager struct {
h Heap
idx int
}

func Constructor(n int) SeatManager {
h := Heap{}
heap.Init(&h)

return SeatManager{
h: h,
idx: 0,
}
}

func (this *SeatManager) Reserve() int {
if this.h.Len() > 0 {
return heap.Pop(&this.h).(int)
} else {
this.idx++
return this.idx
}
}

func (this *SeatManager) Unreserve(seatNumber int) {
heap.Push(&this.h, seatNumber)
}