数据结构:堆的特点
- 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]
方法五:快排
最近在整理各种排序算法,等整理好后,届时同步更新