小伙伴们大家好,今天给大家带来一道算法题:寻找数据流的中位数。
也许小伙伴们会有疑问,我直接把数组sort一下,根据奇偶数量返回不就行了吗?这样当然可以,不过不今天给大家带来更有趣的方法。
先给大家看一下代码:
cpp
#include<iostream>
#include<queue>
using namespace std;
double getmid(int *a,int n){
priority_queue<int,vector<int>,greater<int> >q1;
priority_queue<int,vector<int>,less<int> >q2;
for(int i=0;i<n;i++){
if(i==0){
q2.push(a[i]);
continue;
}
if(a[i]>q2.top()){
q1.push(a[i]);
}
else{
q2.push(a[i]);
}
int x=q1.size()-q2.size();
if(x>=2){
q2.push(q1.top());
q1.pop();
}
if(-x>=2){
q1.push(q2.top());
q2.pop();
}
}
if(n&1){
if(q2.size()==n/2){
return q1.top();
}
else{
return q2.top();
}
}
else{
return (q1.top()+q2.top())/2.0;
}
}
int main(){
int arr[8]={3,4,7,5,3,2,9,6};
double mid=getmid(arr,8);
cout<<mid;
}
准备一个大根堆和 一个小根堆。当数组中的元素是第一个数时,存入大根堆。以后元素到来时,如果比大根堆的堆顶大就进入小根堆,否则留在大根堆。当大根堆比小根堆数量多2时,就将大根堆的堆顶放到小根堆中,当小根堆比大根堆数量多2时,就将小根堆的堆顶放到大根堆中。当数组遍历完成后,大根堆保留了n/2或n/2+1个小元素,小根堆保留了剩下的大元素。我们在根据数组元素个数的奇偶返回相应值即可。具体看上述代码。
这道算法题比较简单,主要是锻炼大家思维的,谢谢观看!!多多点赞支持。