LeetCode0347.前k个高频元素 Go语言AC笔记

时间复杂度:O(n logn)

解题思路

思路很简单,用哈希表存储每个元素的频率,最后对频率排序输出对应的元素。

所以比较好的方法是用优先队列(堆),可以将元素及对应频率组成一个结构体按照频率大的在堆顶排序的方式存放到优先队列中,这样当我们存放好所有元素及其频率时,输出k个堆顶元素就是结果。

AC代码

func topKFrequent(nums []int, k int) (res []int) {
    m:=make(map[int]int)
    for _,num:=range nums{
        m[num]++
    }
    q:=priorityQueue{}
    for k,v:=range m{
        heap.Push(&q,&Item{num:k,count:v})
    }
    for len(res)<k{
        item:=heap.Pop(&q).(*Item)
        res=append(res,item.num)
    }
    return res
}

type Item struct{
    num int
    count int
}
type priorityQueue []*Item

func (pq priorityQueue)Len()int{
    return len(pq)
}
func (pq priorityQueue)Less(i,j int)bool{
    return pq[i].count>pq[j].count //从小到大排序,大的在后面
}
func (pq priorityQueue)Swap(i,j int){
    pq[i],pq[j]=pq[j],pq[i]
}
func (pq *priorityQueue)Push(x interface{}){
    *pq=append(*pq,x.(*Item))
}
func (pq *priorityQueue)Pop()interface{}{
    n:=len(*pq)
    item:=(*pq)[n-1]//最大的元素
    *pq=(*pq)[:n-1]
    return item
}

感悟

这题用golang做差点给我整吐了,medium题做出了hard的感觉,主要是对golang的heap不太熟悉,需要自己重写方法,不过收获还是蛮多的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SwithunH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值