堆
heap存放一个完全二叉树,并保证子节点上的数比父节点上的小
vector<int> heap;
// 获得最大值
void top()
{
return heap[0];
}
// 插入任意值:把新的数字放在最后一位,然后上浮
void push(int k)
{
heap.push_back(k); //先在末尾添加
swim(heap.size() - 1); //对末尾(标号)的数进行上浮
}
// 删除最大值:把最后一个数字挪到开头,然后下沉
void pop()
{
heap[0] = heap.back();
heap.pop_back();
sink(0);
}
// 上浮
void swim(int pos)
{
while (pos > 1 && heap[pos/2] < heap[pos]))
{
swap(heap[pos/2], heap[pos]);
pos /= 2;
}
}
// 下沉
void sink(int pos)
{
while (2 * pos <= N)
{
int i = 2 * pos;
if (i < N && heap[i] < heap[i+1]) ++i;
if (heap[pos] >= heap[i]) break;
swap(heap[pos], heap[i]);
pos = i;
}
}
直接定义时可以用
priority_queue<元素:<int>> heap;
默认按从大到小排序,heap.top()是最大值,heap.top();
如果建立小堆,需要自定义或者重载小于号
struct Comp
{
bool operator() (ListNode* l1, ListNode* l2)
{
return l1->val > l2->val; //表示从小到大,就理解为前面是子节点,后面是父节点,与sort()排序时自定义的 //函数相反 ,代表元素小的优先级大
}
};
priority_queue<ListNode*, vector<ListNode*>, Comp> heap;
形式:priority_queue<元素,vector<元素>,Comp> heap;

浙公网安备 33010602011771号