priority_queue的本质是一个堆,堆的概念就是一个存储数据的数组。
堆的实现可以参照:https://blog.csdn.net/xiajun07061225/article/details/8553808
使用时,一开始我是用了heap,使用如下函数:make_heap、push_heap、pop_heap、sort_heap、is_heap、is_heap_until。感受就是很混乱,代码修改起来也不是很方便,但是一套流程走下来可以对堆的实现原理有一个比较清楚的了解。
后面我就发现了priority_queue,这个封装的比较好,易于使用。
********************************方法一
struct Node {
int x,y;
bool operator <(Node a) const { //必须加const
return y < a.y;
}
bool operator >(Node a) const { //必须加const
return y > a.y;
}
};
// priority_queue A; //默认 大根堆
priority_queue, less>A; //大根堆
priority_queue, greater > B; //小根堆
********************************类似方式法一
struct Node {
int x;
int y;
friend bool operator<(const Node &a,const Node &b) {
return a.x < b.x; //大顶堆
}
friend bool operator>(const Node &a,const Node &b) {
return a.x > b.x; //小顶堆
}
};
priority_queue A; //默认 大根堆
priority_queue, greater > B; //小根堆
********************************方法二:
struct Node {
int x;
int y;
};
bool operator<(const Node &a, const Node &b) {
return a.x(const Node &a, const Node &b) {
return a.x>b.x; //小顶堆
}
priority_queue,less > A; //大根堆
priority_queue, greater > B; //小根堆
//********************************方法三:
struct Node {
int x;
int y;
};
struct cmp {
bool operator()(Node a,Node b) {
return a.x > b.x; //小顶堆
}
};
struct cmp1 {
bool operator()(Node a,Node b) {
return a.x < b.x; //大顶堆
}
};
priority_queue,cmp1 > A; //大根堆
priority_queue, cmp > B; //小根堆
//当队列节点是指针时,用法不同
struct Node {
int x;
int y;
};
struct cmp {
bool operator () (Node const *n1, Node const *n2) {
return n1->xx; //大顶推
}
};
struct cmp1 {
bool operator () (Node const *n1, Node const *n2) {
return n1->x>n2->x; //小顶推
}
};
priority_queue, cmp > A; //大根堆
priority_queue, cmp1 > B; //小根堆
此部分参考https://blog.csdn.net/qq_32541007/article/details/71057282
具体实现:
使用LeetCode上第23题,合并K个排序链表为例。
算法思路:
代码如下:
class Solution {
public:
struct cmp {
bool operator()(ListNode* a,ListNode* b) {
return a->val > b->val; //小顶堆
}
};
ListNode* mergeKLists(vector& lists) {
if(lists.size() == 0){
return nullptr;
}
if(lists.size() == 1){
return lists[0];
}
priority_queue, cmp> B;
for(int i=0;inext=t;
}
if(t->next!=NULL){
B.push(t->next);
}
}
return res;
}
};