2024-03-19 02:45:09 +08:00

71 lines
1.3 KiB
Go

package main
//一模一样的题目
//347 刷一下
//数字表
type StringTable struct {
key string
val int
}
//构建最小堆
func minHeap(heap []StringTable, k int) {
for i := k/2 - 1; i >= 0; i-- {
if heap[i].val > heap[(i+1)*2-1].val {
tmp := heap[i]
heap[i] = heap[(i+1)*2-1]
heap[(i+1)*2-1] = tmp
//0123
//1234
}
if k > (i+1)*2 && heap[i].val > heap[(i+1)*2].val {
tmp := heap[i]
heap[i] = heap[(i+1)*2]
heap[(i+1)*2] = tmp
}
}
}
func topKFrequent(words []string, k int) []string {
//hashmap计算各个数字次数
var numMap = make(map[string]int)
for _, val := range words {
numMap[val]++
}
//构建优先队列
var heap = make([]StringTable, k)
var i = 0
for key, val := range numMap {
if i >= k {
break
}
heap[i] = StringTable{key, val}
i++
numMap[key] = 0
}
//构建一次最小堆
minHeap(heap, k)
for key, val := range numMap {
if val == 0 {
continue
}
//后面的继续进入堆,对比第一个位置
if heap[0].val < val {
heap[0] = StringTable{key, val}
minHeap(heap, k)
}
}
//比那个多了一个排序,来次快排
//TODO:快排
var ret []string
for i = k - 1; i >= 0; i-- {
ret = append(ret, heap[i].key)
}
return ret
}
func main() {
topKFrequent([]string{"the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is"}, 4)
}