692.top-k-frequent-words.go 844 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. type pair struct {
  2. word string
  3. freq int
  4. }
  5. type minHeap []pair
  6. func (h minHeap) Len() int { return len(h) }
  7. func (h minHeap) Less(i, j int) bool {
  8. if h[i].freq != h[j].freq {
  9. return h[i].freq < h[j].freq
  10. }
  11. return h[j].word < h[i].word
  12. }
  13. func (h minHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
  14. func (h *minHeap) Push(x interface{}) {
  15. *h = append(*h, x.(pair))
  16. }
  17. func (h *minHeap) Pop() interface{} {
  18. l := h.Len()
  19. x := (*h)[l-1]
  20. *h = (*h)[:l-1]
  21. return x
  22. }
  23. func topKFrequent(words []string, k int) []string {
  24. m := make(map[string]int)
  25. for _, word := range words {
  26. m[word]++
  27. }
  28. i := 0
  29. var h minHeap
  30. for word, freq := range m {
  31. heap.Push(&h, pair{word, freq})
  32. i++
  33. if k < i {
  34. heap.Pop(&h)
  35. }
  36. }
  37. res := make([]string, k)
  38. for i = k - 1; 0 <= i; i-- {
  39. p := heap.Pop(&h).(pair)
  40. res[i] = p.word
  41. }
  42. return res
  43. }