code top push

dx2019發表於2024-03-05

`

type IntHeap struct {
sort.IntSlice
}

func (h *IntHeap) Push(v interface{}) {
h.IntSlice = append(h.IntSlice, v.(int))
}

func (h *IntHeap) push(v int) {
heap.Push(h, v)
}

func (h *IntHeap) Pop() interface{} {
n := len(h.IntSlice) - 1
num := h.IntSlice[n]
h.IntSlice = h.IntSlice[:n]
return num
}

func (h *IntHeap) pop() int {
return heap.Pop(h).(int)
}

func (h *IntHeap) top() int {
return h.IntSlice[0]
}

func maxEvents(events [][]int) int {
sort.Slice(events, func(i, j int) bool {
if events[i][0] < events[j][0] {
return true
} else {
return false
}
})

ans := 0
hp := &IntHeap{} //小頂堆,儲存目前可以參加的所有會議的截止時間
index := 0 // maxEvents遍歷到的下標
maxDay := events[0][1] //現在遍歷到的最大的會議結束的天數
//i代表今天是第幾天
for i := events[0][0]; index < len(events) || i <= maxDay; i++ {
	for ; index < len(events) && events[index][0] == i; index++ {
		if maxDay < events[index][1] {
			maxDay = events[index][1]
		}
		hp.push(events[index][1])
	}
	for hp.Len() > 0 && hp.top() < i {
		hp.pop()
	}
	if hp.Len() != 0 {
		ans++
		hp.pop()
	}
	if index == len(events) && hp.Len() == 0 {
		break
	}
}
return ans

}`

相關文章