1常侣、題目
前K個(gè)高頻單詞 - 力扣(LeetCode) https://leetcode-cn.com/problems/top-k-frequent-words/
2荡澎、題解
本題首先就是需要統(tǒng)計(jì)相同單詞的個(gè)數(shù)掉奄,使用單詞的值來作為HashMap的K路鹰,每計(jì)數(shù)一次就加一狰晚。之后我們需要寫一個(gè)優(yōu)先隊(duì)列來設(shè)置排序的規(guī)則固翰。在比較器中將單詞先按單詞長度狼纬,再按字母升序的順序進(jìn)行排序羹呵。然后將hashMap中的字符串添加到優(yōu)先隊(duì)列之中,如果超過我們所要的字符串?dāng)?shù)量疗琉,就調(diào)用poll()移除隊(duì)首元素.【因?yàn)镴ava的優(yōu)先隊(duì)列是二叉樹小頂堆冈欢,所以隊(duì)首元素就是最小的那個(gè)。比較大小的規(guī)則由比較器決定盈简〈粘埽】最后再將優(yōu)先隊(duì)列中的單詞添加到result集合中,反轉(zhuǎn)result即可柠贤∠愫疲【因?yàn)槲覀冊陂L度部分是升序排列,所以需要反轉(zhuǎn)一下臼勉×诳裕】
3、代碼
class Solution {
public List<String> topKFrequent(String[] words, int k) {
//數(shù)個(gè)數(shù)
HashMap<String, Integer> contentMap = new HashMap<>();
for (String word:words) {
contentMap.put(word,contentMap.getOrDefault(word,0)+1);
}
//新建對象的時(shí)候可以指定一個(gè)初始容量宴霸,其容量會自動(dòng)增加囱晴。
PriorityQueue<String> priorityQueue = new PriorityQueue<>(k, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
//升序前減后,降序后減前瓢谢,這里選擇升序畸写。
//o1.compareTo(o2)會返回一個(gè)int值,如果0說明o1和o2相等氓扛,如果返回負(fù)值枯芬,那么o1和o2會倒序排序,返回正值幢尚,那么o1和o2會正序排序破停。
return contentMap.get(o1).equals(contentMap.get(o2))?o2.compareTo(o1):contentMap.get(o1)-contentMap.get(o2);
}
});
for (String word:contentMap.keySet()) {
priorityQueue.offer(word);
if(priorityQueue.size()>k){
priorityQueue.poll();
}
}
ArrayList<String> result = new ArrayList<>();
while (!priorityQueue.isEmpty()){
result.add(priorityQueue.poll());
}
//反轉(zhuǎn)
Collections.reverse(result);
return result;
}
}
4、執(zhí)行結(jié)果
image.png