劍指offer(63)數據流中的中位數

題目描述

如何獲得一個數據流中的中位數?若是從數據流中讀出奇數個數值,那麼中位數就是全部數值排序以後位於中間的數值。若是從數據流中讀出偶數個數值,那麼中位數就是全部數值排序以後中間兩個數的平均值。咱們使用Insert()方法讀取數據流,使用GetMedian()方法獲取當前讀取數據的中位數。數組

 

題目分析

不一樣的數據結構對應着不一樣的解法,平時作題的時候要時刻想着該選用什麼數據結構數據結構

數據結構 插入的時間複雜度 獲得中位數的時間複雜度
沒有排序的數組 O(1) O(n)
排序的數組 O(n) O(1)
排序鏈表 O(n) O(1)
二叉搜索樹 平均O(logn),最差O(n) 平均O(logn),最差O(n)
AVL樹 O(logn) O(1)
最大堆和最小堆 O(logn) O(1)

 

代碼

這裏只給出下第二種方法,就是插入的時候保持數組一直有序。spa

const array = []; function Insert(num) { array.push(num); for (let i = array.length - 2; array[i] > num; i--) { [array[i], array[i + 1]] = [array[i + 1], array[i]]; } } function GetMedian() { if (array.length & 1 === 1) { return array[(array.length - 1) / 2]; } return (array[array.length / 2] + array[array.length / 2 - 1]) / 2; }
相關文章
相關標籤/搜索