692. 前K个高频单词
approach 1,优先队列
class Solution {
public List<String> topKFrequent(String[] words, int k) {
Map<String, Integer> map = new HashMap<>();
for (String w : words) {
map.put(w, map.getOrDefault(w, 0) + 1);
}
PriorityQueue<String> pq = new PriorityQueue<>((a, b) -> {
if (map.get(a).equals(map.get(b))) {
return b.compareTo(a);
}
return map.get(a) - map.get(b);
});
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (pq.size() < k) {
pq.offer(entry.getKey());
} else if (entry.getValue() > map.get(pq.peek())
|| (entry.getValue() == map.get(pq.peek()) && entry.getKey().compareTo(pq.peek()) < 0)) {
pq.poll();
pq.offer(entry.getKey());
}
}
List<String> res = new ArrayList<>();
while (!pq.isEmpty()) {
res.add(pq.poll());
}
Collections.reverse(res);
return res;
}
}