题目:
给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字典顺序 排序。
思路:
首先要统计每一个单词的出现次数,然后根据次数以及首字母进行排序,最后返回前k个单词。
1.统计次数可以用哈希表.单词本身作为key,单词出现的次数作为value。创建完哈希表,进行赋值的时候要注意,如果这个单词不在哈希表中,那么首先要给这个键对应的值赋为0,然后再在0的基础上+1。
2.排序可以用最小堆。有一点要注意,当这个堆的元素个数超过k时,必须要将堆顶元素剔除,这样遍历完第1步中创建的整个哈希表时,最小堆里面的元素就刚好是我们要的前k个元素。
3.找出来的单词可以放在动态数组里面。
4.因为我们用的是最小堆,所以在最后还要将数组反转再返回。
代码:
public class Solution692 {
public List<String> topKFrequent(String[] words, int k) {
HashMap<String,Integer> map=new HashMap<>();
PriorityQueue<String> minheap=new PriorityQueue<>(
(w1,w2) -> map.get(w1).equals(map.get(w2)) ? w2.compareTo(w1): map.get(w1)- map.get(w2)
);
for (int i = 0; i < words.length; i++){
if(!map.containsKey(words[i])) map.put(words[i],0 );
map.put(words[i],map.get(words[i])+1);
}
for (String s :map.keySet()) {
minheap.add(s);
if(minheap.size()>k) minheap.poll();
}
List<String> res=new ArrayList<>() ;
while (!minheap.isEmpty()) res.add(minheap.poll());
Collections.reverse(res);
return res;
}
}