关于堆操作函数的参考链接
https://blog.csdn.net/qq_29630271/article/details/66478256
思路:
如何插入数据?
建立最大堆和最小堆。当当前的数据的数目是偶数偶数的时候将数据插入最小堆,如果当前插入数据比最大堆的堆顶数字小,则将该数字插入最大堆,调整最大堆,把最大堆的堆顶数字弹出然后插入最小堆。
当当前数据数目是奇数的时候将数据插入最大堆。如果此时待插入的数据比最小堆的堆顶大,则把数据先插入最小堆,调整最小堆,弹出最小堆的堆顶,将其插入最大堆。
如何获得中位数?
当数据的数目是奇数的时候,最小的堆顶就是中位数,
而数据的数目是偶数的时候,中位数就是(最小堆堆顶 + 最大堆堆顶)/2
;
class Solution {
public:
void Insert(int num)
{
int n = smallHeap.size() + bigHeap.size();//当前节点数量
if((n & 1))//当前节点数量是奇数就插入最大堆
{
if(smallHeap.size() > 0 && num > smallHeap[0])//本想插入最大堆但它比最小堆堆顶小
{
//放入到最小堆
smallHeap.push_back (num);
push_heap(smallHeap.begin(), smallHeap.end(), greater<int>() );
num = smallHeap[0];//获得最小堆堆顶
//把最小堆堆顶放到末尾
pop_heap(smallHeap.begin(), smallHeap.end(), greater<int>() );
smallHeap.pop_back ();//弹出最小堆堆顶
}
bigHeap.push_back (num);//将最小堆堆顶放到最大堆
push_heap(bigHeap.begin(), bigHeap.end(), less<int>() );//调整堆
}
else
{
//数据数目是偶数插入最小堆
//但是此时比最大堆堆顶小
if(bigHeap.size() > 0 && num < bigHeap[0])
{
//放到最大堆,并调整最大堆
bigHeap.push_back (num);
push_heap(bigHeap.begin(), bigHeap.end(), less<int>() );
num = bigHeap[0];//获得堆顶
//把堆顶放到末尾
pop_heap(bigHeap.begin(), bigHeap.end(), less<int>() );
bigHeap.pop_back ();//弹出堆顶
}
smallHeap.push_back (num);//放到最小堆
push_heap(smallHeap.begin(), smallHeap.end(), greater<int>() );
}
}
double GetMedian()
{
int n = smallHeap.size() + bigHeap.size();
if(n == 0)
return 0;
if((n & 1))//数据总数是奇数的时候中位数就是小堆堆顶
{
return smallHeap[0];
}
else
{
//偶数就是(最小堆堆顶+ 最大堆堆顶)/2
return (bigHeap[0] + smallHeap[0]) * 1.0 / 2.0;
}
}
private:
vector<int>smallHeap;//最小堆
vector<int>bigHeap;//最大堆
};
=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking