leetcode-692 前K个高频单词 Python优先队列的使用
解题思路
- hash+sort
统计每个单词出现的频率,然后对字典进行自定义排序,自定义排序操作
sorted(word_dict.items(),key=functools.cmp_to_key(comp))
- hash+priorityqueue
统计每个单词出现的频率,使用优先队列来进行排序
题中出现前K大,或者前K小都可以通过优先队列实现logn复杂度的计算,堆排序在堆顶取出元素的复杂度是\(O(1)\),堆排序的过程时间复杂度是\(O(logn)\)
python中优先队列的使用
-
heapq
heapq是二叉堆,用普通列表实现,可以获取和插入最小值,只提供最小堆,因此必须添加额外步骤保证排序稳定性
import heapq
q = []
heapq.heappush(q, (2, 'a'))
heapq.heappush(q, (1, 'b'))
heapq.heappush(q, (3, 'c'))
while q:
next_item = heapq.heappop(q)
print(next_item)
-
PriorityQueue
PriorityQueue是通过heapq实现的,时间复杂度同heapq相同,添加了同步机制
优先队列排序时,默认是小顶堆,默认按照第一个值的大小排列,如果第一个值相同,默认按照第二个值的升序排列
from queue import PriorityQueue
q = PriorityQueue()
q.put((2, 'a'))
q.put((1, 'b'))
q.put((3, 'c'))
while not q.empty():
next_item = q.get()
print(next_item)
代码
from queue import PriorityQueue
class Solution:
def topKFrequent(self, words, k: int):
q=PriorityQueue()
word_dict={}
for item in words:
if item in word_dict:
word_dict[item]+=1
else:
word_dict[item]=1
for item in word_dict.items():
q.put((-item[1],item[0]))
res=[]
for i in range(k):
res.append(q.get()[1])
return res
import functools
class Solution:
def topKFrequent(self, words, k: int):
word_dict={}
for item in words:
if item in word_dict:
word_dict[item]+=1
else:
word_dict[item]=1
def comp(x,y):
if x[1]>y[1]:
return -1
elif x[1]==y[1]:
if x[0]<y[0]:
return -1
else:
return 1
else:
return 1
res=sorted(word_dict.items(),key=functools.cmp_to_key(comp))
return [item[0] for item in res[:k]]