给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字典顺序 排序。
示例 1:
输入: words = [“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, 2 和 1 次。
注意:
1 <= words.length <= 500
1 <= words[i] <= 10
words[i] 由小写英文字母组成。
k 的取值范围是 [1, 不同 words[i] 的数量]
进阶:尝试以 O(n log k) 时间复杂度和 O(n) 空间复杂度解决。
来源:力扣(LeetCode)
可以先统计词频,得出词频表然后再根据条件排序,返回前k个单词。
class Solution:
def topKFrequent(self, words: List[str], k: int) -> List[str]:
return [i[0] for i in sorted(list(Counter(words).items()),key=lambda x:(-x[1],x[0]))[:k]]

当然题目只要求返回前k个单词,所以使用选择排序效果理论上是更好的,只需要运行k轮选择排序就可以返回结果。
class Solution:
def topKFrequent(self, words: List[str], k: int) -> List[str]:
words=list(Counter(words).items())
for i in range(k):
MAX=words[i]
temp=i
for j in range(i+1,len(words)):
if words[j][1]>MAX[1]:
MAX=words[j]
temp=j
elif words[j][1]==MAX[1]:
if words[j][0]<MAX[0]:
MAX=words[j]
temp=j
words[i],words[temp]=words[temp],words[i]
return [i[0] for i in words[:k]]
