时间复杂度: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不太熟悉,需要自己重写方法,不过收获还是蛮多的。