劍指offer——64.資料流中的中位數
阿新 • • 發佈:2019-02-08
題目描述
如何得到一個數據流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。
程式碼
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
}
}