题目描述:
给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字母顺序 排序。
示例:输入: words = [“i”, “love”, “leetcode”, “i”, “love”, “coding”], k = 2
输出: [“i”, “love”]
解析: “i” 和 “love” 为出现次数最多的两个单词,均为2次。
注意,按字母顺序 “i” 在 “love” 之前。
卡点:
1.不知道键值对可以存进堆里?
2.然后不知道堆里如何比较字母顺序
对于卡点1来说,堆不一定只能存一个数,可以放一个任何类型。这里就直接把键值对封装成一个对象放进去
对于卡点2来说,堆可以自定义比较大小的方式,然后python字符串之间用比较符实际上就是比较第一个字母的ASCII码大小,如
str1 = "abc"
str2 = "xyz"
str1>str2#返回true
题解1:哈希表+最小堆法。
看到前k个或者第k个就联想到堆,最后题目就是用哈希表+堆的方法,用最小堆的解法,始终让最小堆里保留k个元素,大于k了就把堆顶pop出去,这样能保证堆里面的都是最大的。最后把堆里元素取出然后翻转。
class Solution:
def topKFrequent(self, words: List[str], k: int) -> List[str]:
#堆+哈希表
#卡点:不知道键值对可以存进堆里? 然后不知道堆里如何比较字母顺序
dict = {}
for i in words:
if i in dict:
dict[i] = dict[i]+1
else:
dict[i]=1
heap = []
for key,value in dict.items():
heapq.heappush(heap,Node(key,value))
if len(heap) > k:
heapq.heappop(heap)
res = []
while len(heap)>0:
tmp = heapq.heappop(heap)
res.append(tmp.key)
res.reverse()
return res
class Node:
def __init__(self,key,value):
self.key = key
self.value = value
def __lt__(self,other):
return self.key> other.key if self.value==other.value else self.value<other.value
题解2:哈希表暴力遍历法,主要思路是将每个单词出现次数遍历出来,将单词作为key,出现次数作为value,形成哈希表。对哈希表按照value值大小,进行排序。取前k个单词即可。
class Solution:
def topKFrequent(self, words: List[str], k: int) -> List[str]:
dict = {}
for i in words:
if i not in dict:
dict[i] = 1
else:
dict[i] += 1
sortlist = sorted(dict.items(),key=lambda x:(-x[1],x[0]))
return [item[0] for item in sortlist][0:k]
lambda表达式中,冒号后的参数可以有两个,这种情况是 以第一个参数作为排序的优先规则,第二个参数是在第一个参数相同时使用(这是元组间比较大小的规则)
第一个参数为负,则从大到小排序;如果第一个参数相同,则直接按字典顺序排序(Python3中的字符串排序默认为字典序)