文章目录
堆之基础题目
1.前K个高频元素
1.1优先级对列(小顶堆)
//构建小顶堆
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[0 : n-1]
return x
}
//小顶堆
func topKFrequent(nums []int, k int) []int {
map_num := map[int]int{}
//1.要统计元素出现频率
for _, item := range nums {
map_num[item]++
}
h := &IHeap{}
heap.Init(h)
//2.对频率排序,用固定大小为k的小顶堆,扫面所有频率的数值
//
for key, value := range map_num {
heap.Push(h, [2]int{key, value})
if h.Len() > k { // 如果堆的大小大于了K,则队列弹出,弹出堆顶元素,保证堆的大小一直为k
heap.Pop(h)
}
}
res := make([]int, k)
//3.找出前K个高频元素
//按顺序返回堆中的元素,// 找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒序来输出到数组
for i := k - 1; i >= 0; i-- {
res[i] = heap.Pop(h).([2]int)[0]
}
return res
}
347.前K个高频元素
1.2快速排序
func topKFrequent(nums []int, k int) []int {
ans:=[]int{}
map_num:=map[int]int{}
for _,item:=range nums {
map_num[item]++
}
for key,_:=range map_num{
ans=append(ans,key)
}
//核心思想:排序
//可以不用包函数,自己实现快排
sort.Slice(ans,func (a,b int)bool{
return map_num[ans[a]]>map_num[ans[b]]
})
return ans[:k]
}