数据流中的中位数
- 参与人数:1245时间限制:1秒空间限制:32768K
- 算法知识视频讲解
题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
#include<iostream>
#include <queue>
#include <algorithm>
#include<functional>
using namespace std;
//在进行size减法的时候遇到了一个问题,就是得到的是无符号整数,不能进行判断大小的比较,比如
class Solution {
public:
priority_queue<int, vector<int>, less<int>> p1;
priority_queue<int, vector<int>, greater<int>> p2;
void Insert(int num)
{
if (p1.empty() || num <= p1.top())p1.push(num);
else p2.push(num);
//p1.size()调用的是priority_queue底层容器vector的size()函数,是无符号整形,
//如果p1.size()<p2.size(),那么两者进行减法得到的数也是无符号的整数。所以不能用来判断是否大于等于2,
//需要将其转换为有符号整数int类型才可以
auto res = p1.size() - p2.size(); //无符号整数
if ((int)(res) >= 2) //如果不进行强制类型转换,则如果res在int下为负数的话,在无符号下可能标示为很大的数,那么判断结果也是true,显然不符合
{
p2.push(p1.top());
p1.pop();
}
auto res2 = p1.size() - p2.size(); //无符号整数
if ((int)(res2) == -1)
{
p1.push(p2.top());
p2.pop();
}
}
double GetMedian()
{
return p1.size() == p2.size() ? (p1.top() + p2.top()) / 2.0 : p1.top();
}
};
int main()
{
int data[] = { 5, 2, 3, 4, 1, 6, 7, 0, 8 };
vector<int> vec(data,data+9);
Solution s;
for (int i = 0; i < 8; i++)
{
s.Insert(vec[i]);
double x = s.GetMedian();
cout << x << endl;
}
system("pause");
return 0;
}