074_前K个高频元素
知识点:堆、哈希表
LeetCode第三百四十七题:https://leetcode-cn.com/problems/top-k-frequent-elements/submissions/
语言:GoLang
// 朴素解法,暴力、时间5%, 空间62%
func topKFrequent_(nums []int, k int) []int {
hMap := map[int]int{}
for _, v := range nums {
hMap[v]++
}
// fmt.Println(hMap)
result := []int{}
for ; k > 0; k-- {
k, v := 0, 0
for kk, vv := range hMap {
if vv >= v {
k, v = kk, vv
}
}
hMap[k] = 0
result = append(result, k)
}
return result
}
// IntHeap 是一个由整数组成的最小堆。
type IntHeap [][2]int
func (h IntHeap) Len() int { return len(h) }
func (h IntHeap) Less(i, j int) bool { return h[i][1] < h[j][1] }
func (h IntHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
func (h *IntHeap) Push(x interface{}) {
// Push 和 Pop 使用 pointer receiver 作为参数,
// 因为它们不仅会对切片的内容进行调整,还会修改切片的长度。
*h = append(*h, x.([2]int))
}
func (h *IntHeap) Pop() interface{} {
heap := *h
x := heap[len(heap) - 1]
*h = heap[ : len(heap) - 1]
return x
}
// 按照数组统计生成一个hMap,然后将map转化为heap
// 之后按顺序从堆里面输出前k个即可
func topKFrequent(nums []int, k int) []int {
hMap := map[int]int{}
for _, v := range nums {
hMap[v]++
}
h := &IntHeap{}
heap.Init(h)
i := 0
for key, value := range hMap {
heap.Push(h, [2]int{key, value})
i++
// 小优化点:将堆大小控制在k
if i > k {
heap.Pop(h)
}
}
result := make([]int, k)
for ; k > 0; k-- {
ele := heap.Pop(h).([2]int)
result[k - 1] = ele[0]
}
return result
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端