[路飞]【Leetcode.692】前k个高频单词

142 阅读1分钟

题目

地址

给一非空的单词列表,返回前 k 个出现次数最多的单词。

返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。

解析

前K个 => 顶堆 优先队列

  1. 获取单词出现次数的一个map
  2. 通过优先队列,更具排序的要求 创建大顶堆
  3. 比较队列交换大小的方法:
    1. 次数比较
    2. 字母比较
  4. 因为有两个比较条件,我们需要特别修改我们的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
}