给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
// 定义小根堆
type MinHeap [][2]int
func (M MinHeap) Len() int {
return len(M)
}
func (M MinHeap) Less(i, j int) bool {
return M[i][1] < M[j][1]
}
func (M MinHeap) Swap(i, j int) {
M[i], M[j] = M[j], M[i]
}
func (M *MinHeap) Push(item interface{}) {
*M = append(*M, item.([2]int))
}
func (M *MinHeap) Pop() interface{} {
if M.Len() == 0 {
return nil
}
old := *M
length := len(old)
item := old[length-1]
*M = old[:length-1]
return item
}
func topKFrequent(nums []int, k int) []int {
hashMap := make(map[int]int)
for _, v := range nums {
hashMap[v]++
}
m := &MinHeap{}
heap.Init(m)
for i, v := range hashMap {
heap.Push(m, [2]int{i, v})
if m.Len() > k {
heap.Pop(m)
}
}
result := make([]int, k)
for i := k - 1; i >= 0; i-- {
result[i] = heap.Pop(m).([2]int)[0]
}
return result
}