/*
通过大顶堆+小顶堆来实现。经典。
大顶堆中堆顶的元素如果小于小顶堆堆顶的元素,则大顶堆中的所有元素就都小于小顶堆中的所有元素。如果再保证maxHeap.size()==minHeap.size() 或者 maxHeap.size() == minHeap.size() + 1的话,就使用两个堆顶元素就可以直接计算出中位数。
所以得出:
如果maxHeap.size()==minHeap.size() ,(大顶堆堆顶元素+小顶堆堆顶元素)/2就是中位数;
如果maxHeap.size() == minHeap.size() + 1,大顶堆堆顶元素就是中位数;
*/
/**
* 本代码由九章算法编辑提供。版权所有,转发请注明出处。
* - 九章算法致力于帮助更多中国人找到好的工作,教师团队均来自硅谷和国内的一线大公司在职工程师。
* - 现有的面试培训课程包括:九章算法班,系统设计班,算法强化班,Java入门与基础算法班,Android 项目实战班,Big Data 项目实战班,
* - 更多详情请见官方网站:http://www.jiuzhang.com/?source=code
*/
class Solution {
public:
/**
* @param nums: A list of integers.
* @return: The median of numbers
*/
vector<int> medianII(vector<int> &nums) {
// write your code here
int size=nums.size();
vector<int> res;
for(int i=0;i<size;++i){
addnum(nums[i]);
res.push_back(maxPQ.top());
}
return res;
}
//priority_que<int> max_heap,min_heap;
priority_queue<int> maxPQ; // 默认是大顶堆
priority_queue<int, vector<int>, greater<int> > minPQ; // 小顶堆
vector<int> ans;
int numOfElements = 0;
void addnum(int value){
maxPQ.push(value);
if(numOfElements%2==0){
if(minPQ.empty()){
numOfElements++;
return ;
}else if(maxPQ.top()>minPQ.top()){ // 偶数个 0 1 2 3 4
int r1=maxPQ.top();
int r2=minPQ.top();
maxPQ.pop();
minPQ.pop();
maxPQ.push(r2);
minPQ.push(r1);
}
}else{
minPQ.push(maxPQ.top());
maxPQ.pop();
}
numOfElements++;
}
};
class Solution {
public:
/**
* @param nums: A list of integers.
* @return: The median of numbers
*/
priority_queue<int> maxHeap, minHeap; // 默认为大顶堆
vector<int> ans;
int numOfElements = 0;
vector<int> medianII(vector<int> &nums) {
// write your code here
int cnt = nums.size();
for (int i = 0; i < cnt; ++i) {
addNumber(nums[i]);
ans.push_back(getMedian());
}
return ans;
}
void addNumber(int value) {
maxHeap.push(value);
if (numOfElements%2 == 0) {
if (minHeap.empty()) {
numOfElements++;
return;
}
else if (maxHeap.top() > -minHeap.top()) {
int maxHeapRoot = maxHeap.top();
int minHeapRoot = -minHeap.top();
maxHeap.pop();
minHeap.pop();
maxHeap.push(minHeapRoot);
minHeap.push(-maxHeapRoot);
}
}
else {
minHeap.push(-maxHeap.top());
maxHeap.pop();
}
numOfElements++;
}
int getMedian() {
return maxHeap.top();
}
};