1. 程式人生 > 其它 >首頁(沒有輪播圖)

首頁(沒有輪播圖)

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;