LeetCode - 692. Top K Frequent Words
题目
解析
解法一: 直接排序取前 K
个。(主要是见识一下 Java8
的一些写法)
O(N*logN)
:
class Solution {
public List<String> topKFrequent(String[] words, int k) {
Map<String, Integer> freqs = new HashMap();
for (String word: words)
freqs.put(word, 1 + freqs.getOrDefault(word, 0));
List<String> res = new ArrayList(freqs.keySet());
Collections.sort(res, (w1, w2) -> freqs.get(w1) == freqs.get(w2) ? w1.compareTo(w2) :
freqs.get(w2) - freqs.get(w1));
return res.subList(0, k);
}
}
解法二: 维护一个 K
个数的堆。
O(N*logK)
class Solution {
private class Freq{
String word;
int freq;
public Freq(String word, int freq) {
this.word = word;
this.freq = freq;
}
}
public List<String> topKFrequent(String[] words, int k) {
List<String> res = new ArrayList<>();
if(words == null)
return res;
Queue<Freq>heap = new PriorityQueue<>((o1, o2) -> { // lambda will be slow
if(o1.freq == o2.freq)
return o1.word.compareTo(o2.word);
return -(o1.freq - o2.freq); // big heap
});
HashMap<String, Integer> counts = new HashMap<>();
for(String word : words)
counts.put(word,1 + counts.getOrDefault(word, 0));
counts.forEach((key, val) -> heap.add(new Freq(key, val))); // java 8
for(int i = 0; i < k; i++)
res.add(heap.poll().word);
return res;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论