啥都不说了先上代码
class Solution {
private: vector<int> min; // 最小堆(右)
vector<int> max; // 最大堆,其中所有元素比最小堆的所有元素小
public:
void Insert(int num)
{
if(((max.size() + min.size()) & 1) == 0) { // 偶数,插入最小堆min
if(max.size() && num<max[0]) { // 比最大堆的堆顶小,先插入最大堆,把最大堆最大的元素替出来
max.push_back(num);
push_heap(max.begin(), max.end());
num = max[0];
pop_heap(max.begin(), max.end());
max.pop_back();
}
min.push_back(num);
push_heap(min.begin(), min.end(), greater<int>());
} else { // 奇数,插入最大堆;
if(min.size() && num>min[0]) { // 先放最小堆,替一个小的出来
min.push_back(num);
push_heap(min.begin(), min.end(), greater<int>());
num = min[0];
pop_heap(min.begin(), min.end(), greater<int>());
min.pop_back();
}
max.push_back(num);
push_heap(max.begin(), max.end());
}
}
double GetMedian()
{
int size = max.size() + min.size();
if(size == 0) throw "No numbers";
double median;
if(size & 1 == 1) {
median = min[0];
}
else {
median = (min[0] + max[0]) / 2.0;
}
return median;
}
};
第三次过:
第一次:段错误,数组越界或递归层数太多。 检查了一边代码逻辑没问题,发现 if(((max.size() + min.size()) & 1) == 0)这句因为&优先级比==低,所以出现逻辑错误。
第二次:测试用例不过,人家是3.5的我是3.0。除号/问题。这个挺有意思的,/两边都是int按取整算,/两边有一个是double,结果就是double。(参考 https://blog.csdn.net/lujiandong1/article/details/44225581)至于被赋值的数是double,转不转换我也不清楚。把2改成2.0之后,在几秒焦急地等待后听到了通过的声音!
真好,顺便把今天上午看的heap相关工具函数都复习了~