数据结构-堆(heap)最大堆、最小堆的相关操作和实战

堆(heap)

堆的概念

  1. 是完全二叉树;
  2. 每个节点 >= 或 <= 孩子节点。

条件二中分别对应:最大堆和最小堆。

最大堆:最大值为堆顶元素,每个节点 >= 孩子节点。
最小堆:最小值为堆顶元素,每个节点 <= 孩子节点。

在这里插入图片描述

python中的堆

python中只能直接创建最小堆。如果想要创建最大堆可以先将所有元素乘负一(取反),然后最小堆化,取元素的时候再取反,这样相当于得到最大堆。

应用:top – K、第K个最大值,每次可以取出最大(最小元素)

堆化:把一组无序的数加到堆里面。
注意:堆化操作的时间复杂度为O(N),排序算法的时间复杂度为O(NlogN)

引入方法:将列表堆化,再进行相关操作。
Import heapq
heap = [ ]

  • heapq.heapify(heap):将堆属性应用到列表上(堆化操作)。
  • heapq.heappush(heap, item):将 item 元素加入堆。
  • heapq.heappop(heap):弹出堆顶元素(也就是最小值)
  • heapq.heapreplace(heap, x):弹出堆顶元素,并将元素x 入堆。
  • heapq.merge(*iterables, key=None, reverse=False):将多个有序的堆合并成一个大的有序堆,然后再输出。
  • heapq.heappushpop(heap, item):将item 入堆,然后弹出并返回堆中最小的元素。
  • heapq.nlargest(n, iterable, key=None):返回堆中最大的 n 个元素。
  • heapq.nsmallest(n, iterable, key=None):返回堆中最小的 n 个元素。
代码实战

实战一:用最小堆,解决数组中第K个最大元素的问题。
在这里插入图片描述
代码部分:

import heapq
class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        # 最小堆把n-k小的元素都取出来,下一次取的时候就是第K个最大值了
        heapq.heapify(nums)
        while len(nums) > k:
            heapq.heappop(nums)
        return nums[0]

实战二:用哈希表 + 最小堆 解决前K高频单词的问题
在这里插入图片描述
代码部分:方法二待更新……

class Solution:
    def topKFrequent(self, words: List[str], k: int) -> List[str]:
        # 方法一:哈希表 + 排序
        count = {}
        for word in words:
            count[word] = count.get(word,0) + 1
        sorted_list = sorted(count.items(), key=lambda item: (-item[1], item[0]))
        return [item[0] for item in sorted_list][:k]

        # 方法二:哈希表 + 最小堆   待更新……
        import heapq
参考资料

leetcode 题库例题

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

现实、狠残酷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值