lc-go/solutions/24/q2402/solution.go
2025-12-29 08:46:00 +09:00

77 lines
1.6 KiB
Go

package q2402
import (
"container/heap"
"slices"
)
type Room struct {
id int
meetingStart int
meetingEnd int
}
type Rooms []Room
func (r *Rooms) Len() int { return len(*r) }
func (r *Rooms) Push(x any) { (*r) = append((*r), x.(Room)) }
func (r *Rooms) Swap(i int, j int) { (*r)[i], (*r)[j] = (*r)[j], (*r)[i] }
func (r *Rooms) Less(i int, j int) bool {
if (*r)[i].meetingEnd == (*r)[j].meetingEnd {
return (*r)[i].id < (*r)[j].id
}
return (*r)[i].meetingEnd < (*r)[j].meetingEnd
}
func (r *Rooms) Pop() any {
last := len(*r) - 1
ret := (*r)[last]
*r = (*r)[:last]
return ret
}
func mostBooked(n int, meetings [][]int) int {
timesBooked := make([]int, n)
empty := make(Rooms, n)
for i := range empty {
empty[i] = Room{id: i}
}
inUse := make(Rooms, 0, n)
slices.SortFunc(meetings, func(a, b []int) int { return a[0] - b[0] })
for i := range meetings {
start, end := meetings[i][0], meetings[i][1]
for len(inUse) > 0 && inUse[0].meetingEnd <= start {
heap.Push(&empty, Room{id: inUse[0].id})
heap.Pop(&inUse)
}
if len(empty) > 0 {
id := empty[0].id
timesBooked[id]++
heap.Push(&inUse, Room{
id: id,
meetingStart: start,
meetingEnd: end,
})
heap.Pop(&empty)
} else {
room := &inUse[0]
timesBooked[room.id]++
room.meetingStart, room.meetingEnd = room.meetingEnd, end-start+room.meetingEnd
heap.Fix(&inUse, 0)
}
}
mb, mbIdx := timesBooked[0], 0
for i := 1; i < len(timesBooked); i++ {
if timesBooked[i] > mb {
mb, mbIdx = timesBooked[i], i
}
}
return mbIdx
}
var _ heap.Interface = &Rooms{}
var _ = mostBooked