题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
代码
var arr=[]
function Insert(num)
{
// write code here
arr.push(num);
arr.sort()
}
function GetMedian(){
// write code here
var len=arr.length;
if(len%2!=0){
return arr[Math.floor(len/2)];
}else{
return (arr[len/2-1]+arr[len/2])/2
}
}
思路2:大小顶堆,数据流传输时,第偶个数,存入大顶堆中,然后将大顶堆中最大元素取出放入小顶堆中,第奇个数,存入小顶堆,然后将小顶堆中最小元素取出放入大顶堆中。最后小顶堆存放的元素都大于大顶堆存放元素。
当数量为偶数时候,访问大顶堆中最大元素和小顶堆中最小元素平均值,当数量为奇数时,访问小顶堆中最小元素。
var arr1=[],arr2=[],count=0;
function Insert(num)
{
// write code here
if(count%2==0){
arr1.push(num);
arr1.sort(function(a,b){
return a-b;
})
arr2.push(arr1.pop());
arr2.sort(function(a,b){
return b-a;
})
}else{
arr2.push(num);
arr2.sort(function(a,b){
return b-a;
})
arr1.push(arr2.pop());
arr1.sort(function(a,b){
return a-b;
})
}
count++
}
function GetMedian(){
// write code here
if(count%2!=0){
return arr2[arr2.length-1]
}else{
return (arr1[arr1.length-1]+arr2[arr2.length-1])/2
}
}