剑指offer——64.数据流中的中位数

题目描述

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。

代码

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
    }
}

你可能感兴趣的:(剑指offer-JS)