堆,或者说优先队列,是一颗完全二叉树
一般用数组存储,节点i
的左、右子节点分别为2*i+1
、2*i+2
堆分为小根堆和大根堆(python中为小根堆),小根堆的父节点的值小于或等于子节点的值
heapq
创建堆
1
2
3
4import heapq
heap=[]
heapq.heapify(heap)添加元素
heapq.heappush(heap,num)
弹出元素
弹出堆顶元素,对于python,是最小元素
heapq.heappop(heap)
取最值
取n个最值,返回一个列表
1
2heapq.nlargest(2,heap)
heapq.nsmallest(3,heap)堆合并
heapq.merge(heap1,heap2)
压入弹出
注意分辨两者区别,尤其 num<heap[0] 的时候
- heapq.pushpop(heap,num) # 先push num 再pop heap[0]
- heapq.replace(heap,num) # 先pop heap[0] 再push num
1
2heapq.pushpop(heap,num) # 先push再pop
heapq.replace(heap,num) # 先pop再push一些注意点
- python中的heapq为小根堆,heap[0]为最小元素(C++中默认大根堆)
- python中可以将正整数堆取相反数,来达到大根堆的效果
数组中的第K个最大元素
直接调用堆就行了,虽然用排序也很方便
1 | class Solution: |
丑数 II
1 | class Solution: |
相对名次
1 | class Solution: |