leetcode_692 前K个高频单词

88 阅读1分钟

要求

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

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

示例 1:

输入: ["i", "love", "leetcode", "i", "love", "coding"], k = 2
输出: ["i", "love"]
解析: "i""love" 为出现次数最多的两个单词,均为2次。
    注意,按字母顺序 "i""love" 之前。

示例 2:

输入: ["the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is"], k = 4
输出: ["the", "is", "sunny", "day"]
解析: "the", "is", "sunny""day" 是出现次数最多的四个单词,
    出现次数依次为 4, 3, 21 次。

注意:

  • 假定 k 总为有效值, 1 ≤ k ≤ 集合元素数。
  • 输入的单词均由小写字母组成。  

扩展练习:

尝试以 O(n log k) 时间复杂度和 O(n) 空间复杂度解决。

核心代码

from collections import Counter
class Solution:
    def topKFrequent(self, words: List[str], k: int) -> List[str]:
        d = Counter(words)
        tmp = []
        for word,num in d.items():
            tmp.append((num,word))
        ret = sorted(tmp,key=lambda x:(-x[0],x[1]))
        return [i[1] for i in ret[:k]]

image.png

解题思路:我们使用Counter对单词进行计数,然后我们对数据进行整理,按照频次的降序进行排列,最终我们切片可得前k的高频词,比较简单。