leetcode-692 前K個高頻單詞 Python優先佇列的使用
阿新 • • 發佈:2021-10-16
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)
程式碼
- hash+priorityqueue
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
- hash+sort
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]]