给一非空的单词列表,返回前 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; }
heap