版权声明:所有的博客都是个人笔记,交流可以留言。未经允许,谢绝转载。。。 https://blog.csdn.net/qq_35976351/article/details/88620841
题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数
解题思路
肯定不能用排序,那样肯定会超时。更为稳妥的办法是使用std::multiset
结构,插入数据复杂度是
,同时支持前后迭代。注意迭代器没有it = it + 1
这种操作…
AC代码
class Solution {
public:
void Insert(int num)
{
numbers.insert(num);
int len = numbers.size();
if (len == 1) {
x = y = numbers.begin();
} else if (len % 2 ==1) { // 奇数个
if (num >= *x && num <= *y) { // 插在中间
++x;
y = x;
} else if (num < *x) {
y = x; // 比x小
} else {
x = y; // 比y大
}
} else { // 偶数个
if (num >= *x ) {
++y;
} else {
--x;
}
}
}
double GetMedian()
{
return double (*x + *y) / 2;
}
multiset<int> numbers;
multiset<int>::iterator x, y;
};