用Python刷LeetCode必备知识点1 - 优先级队列

本文介绍了如何在Python中使用heapq模块创建最小堆和最大堆,重点讲解了如何通过重写__lt__()函数来处理自定义类型的优先级队列。并列举了两个例子,展示了优先级队列在LeetCode题目692. Top K Frequent Words和23. Merge k Sorted Lists中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LeetCode里有很多道题都会用到一个数据结构叫优先级队列Priority Queue (min heap 或max heap)。优先级队列是用堆heap来实现的,最小值在队列顶部top的是最小堆(min heap),最大值在队列顶部的是最大堆(max heap)。

在python3,最小堆和最大堆是通过heapq模块和特殊函数__lt__()来实现的。heapq模块是用数组来实现堆的。对含有系统自带(build-in)的数据类型(int, float等)的数组list,可以用heapq成员函数heapify()直接把数组转换成成一个最小堆min heap。而对于用户自定义类型(如ListNode)的数组,则需要通过在自定义类型的类里重写__lt__()来实现最大堆或最小堆的。

最小堆或最大堆实现后,可以用heapq模块提供的两个函数实现压入和弹出的操作:heappush()和heappop()。

以下用两个实例来说明最小堆和最大堆的实现和应用:

最小堆,即永远是最小值在顶部的优先级队列::

import heapq

class FreqWord:
    def __init__(self, w, f):
        self.freq = f
        self.word = w
    #最小堆,每次弹出频率最小的单词
    def __lt__(self, other):
        return self.freq < other.freq

def main():
    word1 = FreqWord("i", 2)
    word2 = FreqWord("love", 3)
    word3 = FreqWord("leetcode",
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值