力扣题:
出现次数最多的K个元素
自定义堆
- 声明类型,实际上是一个切片,切片内部是要排序的对象(这里是一个能存两个元素的数组)
type IHeap[]
[2]int
- 实现接口
就是配置一个堆的各种操作
- 调用
初始化:h := &IHeap{}
heap.Init(h)
入堆:heap.Push(h, [2]int{K, V})
出堆:heap.Pop(h)
func topKFrequent(nums []int, k int) []int {
kcount := map[int]int{}
for _, num := range nums {
kcount[num]++
}
//初始化一个堆
h := &IHeap{}
heap.Init(h)
for K, V := range kcount {
heap.Push(h, [2]int{K, V})
if h.Len() > k {
heap.Pop(h)
}
}
ans := make([]int, k)
i := 0
for h.Len() > 0 {
ans[i] = heap.Pop(h).([2]int)[0]
i++
}
return ans
}
// IHeap 定义小根堆
type IHeap [][2]int //自定义要排序的对象
func (h IHeap) Len() int { return len(h) }
func (h IHeap) Less(i, j int) bool { return h[i][1] < h[j][1] }
func (h IHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
func (h *IHeap) Push(x interface{}) {
*h = append(*h, x.([2]int))
}
func (h *IHeap) Pop() interface{} {
old := *h
n := len(old)
x := old[n-1]
*h = old[:n-1]
return x
}