leetcode-692 前K个高频单词 Python优先队列的使用

leetcode-692 前K个高频单词 Python优先队列的使用

解题思路

  1. hash+sort
    统计每个单词出现的频率,然后对字典进行自定义排序,自定义排序操作
sorted(word_dict.items(),key=functools.cmp_to_key(comp))
  1. 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]]
posted @ 2021-10-16 10:44  流光之中  阅读(123)  评论(0编辑  收藏  举报