自己综合了一些大佬的代码,做个笔记。
其实就是复习一下。。。
整理STL偷懒,现在就遇到了。。。
// 优先级队列Priority Queue
#include <bits/stdc++.h>
using namespace std;
// 适配器容器
// 利用堆实现
//创建
priority_queue<int> values;
int values[]{4,1,3,2}; // 普通数组初始化
priority_queue<int> copy_values(values, values+4); // {4,2,3,1}
array<int,4> values{ 4,1,3,2 }; // 序列式容器初始化
priority_queue<int> copy_values(values.begin(), values.end()); // {4,2,3,1}
int values[]{ 4,1,2,3 }; // 手动指定排序规则和底层容器
priority_queue<int, deque<int>, greater<int> > copy_values(values, values+4); // {1,3,2,4}
//方法
Heap.empty();
Heap.push();
Heap.pop();
Heap.top();
Heap.size();
54题
54题题解
class Solution {
public:
void insert(int num){
maxHeap.push(num);//推n入大顶堆
if(maxHeap.size() > minHeap.size() + 1)//大顶堆比小顶堆+1大
{
int t = maxHeap.top();//t=最大值
maxHeap.pop();//删除最大值
minHeap.push(t);//推入小顶堆
}
while(minHeap.size() && maxHeap.top() > minHeap.top())//大顶堆最大值 比 小顶堆最小值大 且 小顶堆存在
{
int t1 = maxHeap.top();//交换两个极值
int t2 = minHeap.top();
maxHeap.pop(); maxHeap.push(t2);
minHeap.pop(); minHeap.push(t1);
}
}
double getMedian(){
int n1 = minHeap.size();
int n2 = maxHeap.size();
if(n1 == n2) return (minHeap.top() + maxHeap.top()) / 2.0;//输出大顶堆最大值与小顶堆最小值的平均数,即中位数
else return maxHeap.top();
}
private:
priority_queue<int> maxHeap;//优先队列声明大顶堆
priority_queue<int, vector<int>, greater<int>> minHeap;//优先队列声明小顶堆
//int-数据类型,vector<int>-数据容器,greater<int>-仿函数声明用于小顶堆
};
参考资料
https://www.acwing.com/solution/content/1665/
https://blog.csdn.net/txl16211/article/details/44588487
http://c.biancheng.net/view/6987.html
54题链接
https://www.acwing.com/problem/content/88/