Leetcode692 Top K Frequent Words
题目描述
example:
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.
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.
解决方案:
Step1: 统计词频:
Map<String, Integer> map = new HashMap();
for (String word: words) {
map.put(word, map.getOrDefault(word, 0) + 1);
}
或:
HashMap<String, Integer> map = new HashMap<>();
for(String word: words){
if(map.containsKey(word)){
map.put(word,map.get(word)+1);
}else
map.put(word,1);
}
Step2: 比较:
List<String> result = new ArrayList<>();
for(String key : map.keySet()){
result.add(key);
}
Collections.sort(result,(word1,word2)->map.get(word1).equals(map.get(word2))?
word1.compareTo(word2):map.get(word2)-map.get(word1));
Step3: 输出:
return result.subList(0,k);
最优解:Heap
Step1: 统计词频:
Map<String, Integer> map = new HashMap();
for (String word: words) {
map.put(word, map.getOrDefault(word, 0) + 1);
}
Step2: PriorityQueue:
PriorityQueue<String> heap = new PriorityQueue<String>(
(w1, w2) -> count.get(w1).equals(count.get(w2)) ?
w2.compareTo(w1) : count.get(w1) - count.get(w2) );
Step3: 从heap提取前k个值,然后倒序输出
for (String word: count.keySet()) {
heap.offer(word);
if (heap.size() > k) heap.poll();
}
List<String> ans = new ArrayList();
while (!heap.isEmpty()) ans.add(heap.poll());
Collections.reverse(ans);
return ans;