一、题目和困难
牛客网NC50940 Running Median
题目大意是给一段数字序列,当给出了奇数个数字时,求已给出的序列的中位数
思路就是维护一个大顶堆和一个小顶堆,控制大顶堆的数字个数跟小顶堆一样或者大顶堆比小顶堆多一个。当给出了奇数个数字时,大顶堆的数字个数比小顶堆多一个,大顶堆的堆顶就是中位数。
核心代码:
for(int i=1;i<=M;i++){
if((i)%20==1) printf("\n");
int num;
scanf("%d",&num);
if(i==1) h.push(num);
else{
if(h.top()<num) g.push(num);
else h.push(num);
while(h.size()-g.size()>1){
g.push(h.top());
h.pop();
}
while(g.size()>h.size()){
h.push(g.top());
g.pop();
}
}
但这个代码样例都过不了,说是内存超限
调试时出现了一个诡异的现象
很明显这就是问题所在
二、解决
查资料发现size()返回的是一个无符号数,两个无符号数相减,如果结果小