0%

Leetcode692 Top K Frequent Words

Leetcode692 Top K Frequent Words

题目描述

example:

1
2
3
4
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.
1
2
3
4
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: 统计词频:

1
2
3
4
5
6
7
8
9
10
11
12
	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: 比较:

1
2
3
4
5
6
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: 输出:

1
return result.subList(0,k);

最优解:Heap

Step1: 统计词频:

1
2
3
4
Map<String, Integer> map = new HashMap();
for (String word: words) {
map.put(word, map.getOrDefault(word, 0) + 1);
}

Step2: PriorityQueue:

1
2
3
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个值,然后倒序输出

1
2
3
4
5
6
7
8
9
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;
-------------本文结束感谢您的阅读-------------

Welcome to my other publishing channels