0
点赞
收藏
分享

微信扫一扫

堆之基础题目

Greatiga 2022-04-18 阅读 29
golang算法

文章目录

堆之基础题目

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]
}
举报

相关推荐

0 条评论