Python heapq库方法详细介绍,最小堆的实现,Leetcode215 数组中的第K个最大元素(暴力解法、维护最小堆(大小为n和长度为k)、快排)

数据结构:堆的特点

  • 1、内部数据是有序的
  • 2、可以弹出堆顶元素,最小堆(小顶堆/小根堆)弹出的最小值,最大堆(大顶堆/大根堆)弹出的就是最大值
  • 3、每次加入新元素或弹出栈顶元素后,调整堆使之重新有序,时间复杂度O(logn)
    最小堆: 就是具备每一个父节点都小于其子节点这一特点的一个二叉树
    在这里插入图片描述

如图所示,绘制最小堆就是将一个数组,从上到下从左至右绘制出来即可,可以发现每一个父节点均满足小于其所有子节点。

Python heapq() 模块,可以实现最小堆

1、最小堆的创建:
要创建堆,使用初始化为 [] 的列表,或者可以通过 heapify() 方法将一个列表转换为最小堆
2、主要函数
1) heapq.heappush(heap, item)

将值item推入堆heap

import heapq
lst = [1,3,5,2,5]
heapq.heappush(lst, 1) # 将1推入堆中
lst
# [1,3,1,2,5,5]

2) heapq.heappop(heap)

弹出并返回堆中的最小项,要访问堆中的最小项,请使用heap[0]

import heapq
lst = [1,3,5,2,5]
heapq.heappop(lst)
# 1

3) heapq.heappushpop(heap, item)

将item推入堆中,然后弹出并返回堆中的最小值,该操作相当于heappush
()+heappop(),但比这个操作组合更有效

import heapq
lst = [1,3,5,2,5]
print(heapq.heappushpop(lst,6))
print(lst)
# 1
# [3, 2, 5, 6, 5]

4) heapq.heapify(x)

将列表在线性时间内转换为最小堆

import heapq
lst = [1,3,4,5,2]
heapq.heapify(lst)
print(lst)

# [1, 2, 4, 5, 3]

在这里插入图片描述
5) heapq.heapreplace(heap, item)

弹出并返回heap中最小的一项,同时推入新的item

import heapq
lst = [1,3,5,2,5]
heapq.heapreplace(lst, 6)
# 1

6) heapq.nlargest(n, iterable, key=None)

从可迭代对象iterable中返回n个最大元素的列表,key(如果提供)指定一个参数的功能,该参数用于从iterable中的每个元素中提取比较键

import heapq
lst1 = [1,3,5,2,5,6]
heapq.nlargest(3, lst1)

# [6, 5, 5]

7) heaqp.nsmallest(n, iterable, key=None)

从可迭代对象iterable中返回n个最大元素的列表,key(如果提供)指定一个参数的功能,该参数用于从iterable中的每个元素中提取比较键

import heapq
lst1 = [1,3,5,2,5,6]
heapq.nsmallest(3, lst1)
#[1, 2, 3]

Leetcode 215 数组中的第K个最大元素 题目链接
在这里插入图片描述
方法一:暴力解法,看个乐就行,面试的时候必会被喷

def findKthLargest(nums, k):
	nums.sort(reverse =True)
	result = nums[k-1]
	return result

**方法二:维护一个大小为len(nums)的最小堆 **

def findKthLargest(nums, k):
    n = len(nums)
    heap = nums
    heapq. heapify(heap)
    # print(heap) # [1, 2, 3, 5, 6, 4]
    for _ in range(n-k):
        heapq.heappop(heap)
    return heap[0]

**方法三:维护一个大小为K的最小堆 **

def findKthLargest(nums, k):
    minheap = []
    for num in nums:
        heapq.heappush(minheap, num)
        if len(minheap)>k:
            heapq.heappop(minheap)
    return minheap[0]

方法四:直接使用heapq.nlargest

def findKthLargest(nums, k):
    heap = nums
    heapq.heapify(heap)
    nlargest = heapq.nlargest(k,heap)
    return nlargest[-1]

方法五:快排
最近在整理各种排序算法,等整理好后,届时同步更新

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值