Top K Frequent Words 前K个高频单词
给一非空的单词列表,返回前 k 个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。
输入: ["i", "love", "leetcode", "i", "love", "coding"], k = 2
输出: ["i", "love"]
解析: "i" 和 "love" 为出现次数最多的两个单词,均为2次。
注意,按字母顺序 "i" 在 "love" 之前。
思路
通过堆排序,主要设定排序的规则
public List<String> topKFrequent(String[] words, int k) {
HashMap<String, Integer> map = new HashMap<>();
for (int i = 0; i < words.length; i++) {
String s = words[i];
map.put(s,map.getOrDefault(s,0)+1);
}
PriorityQueue<String> pq = new PriorityQueue<String>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
Integer a = map.get(o1);
Integer b = map.get(o2);
int res =0;
if(a.equals(b)){
res = o2.compareTo(o1);
}
else {
res = a -b;
}
return res;
}
});
for (Map.Entry<String, Integer> item : map.entrySet()) {
pq.offer(item.getKey());
if(pq.size()>k){
pq.poll();
}
}
List<String> ans = new ArrayList<>();
while(!pq.isEmpty()){
ans.add(0,pq.poll());
}
return ans;
}
Tag
heap