1. 程式人生 > >劍指offer——64.資料流中的中位數

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