套路就是普通的map和优先级队列的套路
需要着重注意的是输出顺序需要是高频在前面,相同频率则输出字母顺序靠前的。则先按频率排序,再按照字母顺序逆序排序,但由于是小顶堆,所以输出的第一个其实是频率最低,字母顺序靠前的,所以需要逆序。
import java.util.PriorityQueue;
import java.util.HashMap;
import java.util.ArrayList;
import java.util.Collections;
class Solution {
public List<String> topKFrequent(String[] words, int k) {
List<String> res=new ArrayList<String>();
if(words.length==0)return res;
Map<String,Integer> map=new HashMap<String,Integer>();
PriorityQueue<String> pq=new PriorityQueue<String>(new Comparator<String>(){
public int compare(String o1,String o2){
return map.get(o1).equals(map.get(o2)) ?
o2.compareTo(o1) : map.get(o1) - map.get(o2);
}
});
for(int i=0;i<words.length;i++){
map.put(words[i],map.getOrDefault(words[i],0)+1);
}
int count=0;
for (String word: map.keySet()) {
pq.offer(word);
if (pq.size() > k) pq.poll();
}
while (!pq.isEmpty()) res.add(pq.poll());
Collections.reverse(res);
return res;
}
}