Leetcode 692. 前K个高频单词
堆排序的经典问题,值得反复推敲!加了详细的注释,方便日后复习,也希望能帮到其他小伙伴,如有错误,欢迎指正!
Java实现:
class Solution {
public List<String> topKFrequent(String[] words, int k) {
// 用HashMap记录每个word出现的次数,方便排序
Map<String,Integer> counter = new HashMap<String,Integer>();
for (String word : words){
counter.put(word,counter.getOrDefault(word,0) + 1);
}
// 构建小顶堆 方法1:lambda
// PriorityQueue<String> pq = new PriorityQueue<>((w1,w2) ->
// counter.get(w1).equals(counter.get(w2)) ? w2.compareTo(w1) : counter.get(w1) - counter.get(w2)
// );
// 构建小顶堆 方法2:匿名内部类
PriorityQueue<String> pq = new PriorityQueue<>(new Comparator<String>(){
public int compare(String w1,String w2){
return counter.get(w1).equals(counter.get(w2)) ? w2.compareTo(w1) : counter.get(w1) - counter.get(w2);
}
});
// 往小顶堆中添加数据,用小顶堆的原因就是方便删除最靠后的word
for (String w : counter.keySet()){
pq.add(w);
// 如果word个数超过了k,那说明多出来且靠后的word不会被输出,我们直接删除即可
if (pq.size() > k){
pq.poll();
}
}
// 用List存储堆中的word,但是由于我们用的是小顶堆,因此当前输出的顺序是反的,我们逆序一下即可
List<String> res = new ArrayList<>();
while(!pq.isEmpty()){
res.add(pq.poll());
}
Collections.reverse(res);
return res;
}
}