如何獲得一個數據流中的中位數?若是從數據流中讀出奇數個數值,那麼中位數就是全部數值排序以後位於中間的數值。若是從數據流中讀出偶數個數值,那麼中位數就是全部數值排序以後中間兩個數的平均值。咱們使用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; }