# 692. Top K Frequent Words

2020-07-05 23:36:52  阅读：25  来源： 互联网

```package LeetCode_692

import java.util.*
import kotlin.collections.ArrayList
import kotlin.collections.HashMap

/**
* 692. Top K Frequent Words
* https://leetcode.com/problems/top-k-frequent-words/description/
*
* Given a non-empty list of words, return the k most frequent elements.
If two words have the same frequency, then the word with the lower alphabetical order comes first.

Example 1:
Input: ["i", "love", "leetcode", "i", "love", "coding"], k = 2
Output: ["i", "love"]
Explanation: "i" and "love" are the two most frequent words.
Note that "i" comes before "love" due to a lower alphabetical order.

Example 2:
Input: ["the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is"], k = 4
Output: ["the", "is", "sunny", "day"]
Explanation: "the", "is", "sunny" and "day" are the four most frequent words,
with the number of occurrence being 4, 3, 2 and 1 respectively.

Note:
You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
Input words contain only lowercase letters.

Try to solve it in O(n log k) time and O(n) extra space.
* */
class Solution {
/*
* solution 1: HashMap+PriorityQueue, Time complexity:O(nlogk), Space complexity:O(n)
* */
fun topKFrequent(words: Array<String>, k: Int): List<String> {
val map = HashMap<String, Int>()
for (word in words) {
map.put(word, map.getOrDefault(word, 0) + 1)
}
val queue = PriorityQueue<Pair<String, Int>> { a, b ->
if (a.second == b.second) {
//if frequency is same, take the alphabetical desc, because the result need reverse it
b.first.compareTo(a.first)
} else {
//take the frequency asc, because the result need reverse it also
a.second - b.second
}
}
for (item in map) {
queue.offer(Pair(item.key, item.value))
if (queue.size > k) {
queue.remove()
}
}
val result = ArrayList<String>()
while (queue.isNotEmpty()) {
}
return result
}
}```