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

来源:互联网 发布:武功 知乎 编辑:程序博客网 时间:2024/06/01 16:23

题目描述

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

代码

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