123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- type pair struct {
- word string
- freq int
- }
- type minHeap []pair
- func (h minHeap) Len() int { return len(h) }
- func (h minHeap) Less(i, j int) bool {
- if h[i].freq != h[j].freq {
- return h[i].freq < h[j].freq
- }
- return h[j].word < h[i].word
- }
- func (h minHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
- func (h *minHeap) Push(x interface{}) {
- *h = append(*h, x.(pair))
- }
- func (h *minHeap) Pop() interface{} {
- l := h.Len()
- x := (*h)[l-1]
- *h = (*h)[:l-1]
- return x
- }
- func topKFrequent(words []string, k int) []string {
- m := make(map[string]int)
- for _, word := range words {
- m[word]++
- }
- i := 0
- var h minHeap
- for word, freq := range m {
- heap.Push(&h, pair{word, freq})
- i++
- if k < i {
- heap.Pop(&h)
- }
- }
- res := make([]string, k)
- for i = k - 1; 0 <= i; i-- {
- p := heap.Pop(&h).(pair)
- res[i] = p.word
- }
- return res
- }
|