题目
给一非空的单词列表,返回前 k 个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。
解析
前K个 => 顶堆 优先队列
- 获取单词出现次数的一个map
- 通过优先队列,更具排序的要求 创建大顶堆
- 比较队列交换大小的方法:
- 次数比较
- 字母比较
- 因为有两个比较条件,我们需要特别修改我们的compare的方法
代码
// 先定义好我们的compare
function compare(a, b) {
// 这里我们有两个条件
// 每项元素 第一项去word 第二项取word出现次数
return a[1] > b[1] || (a[1] === b[1] && a[1] < b[1])
}
var topKFrequent = function(words, k) {
const heap = new Heap()
const map = {}
// step1
words.forEach(w => {
if (map[w]) {
map[w]++
} else {
map[w] = 1
}
})
Object.entries(map).forEach(v => {
heap.push(v)
})
const res = []
while(heap.size() && k--) {
res.push(heap.top()[0])
heap.pop()
}
return res
}