將數字儲存在可調整大小的容器中。每次需要輸出中間值時,對容器進行排序並輸出中間值。
時間複雜度:o(nlogn)+o(1)≃o(nlogn)。
新增乙個數字對於乙個有效調整大小方案的容器來說需要花費 o(1) 的時間。
找到中間值主要取決於發生的排序。對於標準比較排序,這需要 o(nlogn) 時間。
空間複雜度:o(n) 線性空間,用於在容器中儲存輸入。除了需要的空間之外沒有其他空間(因為通常可以在適當的位置進行排序)。
保持輸入容器始終排序。
時間複雜度:o(n)+o(logn)≈o(n).
二分搜尋需要花費 o(logn) 時間才能找到正確的插入位置。
插入可能需要花費 o(n) 的時間,因為必須在容器中移動元素為新元素騰出空間。
空間複雜度:o(n) 線性空間,用於在容器中儲存輸入。
乙個大頂堆maxheap, 乙個小頂堆minheap,大頂堆儲存前一半的元素,小頂堆儲存後一半的元素。
與此同時,始終保持兩個堆的大小之差不超過1。
為了保證這兩個堆大小之差不超過1,對於元素num的插入過程需分為以下3種情況:
(1) 大頂堆的元素個數 = 小頂堆的元素個數
兩個堆大小相等,如果小頂堆為空或者待插入的元素num≥小頂堆的堆頂元素,則直接把num插入小頂堆中;
否則,把num插入大頂堆中。
(2) 大頂堆的元素個數 < 小頂堆的元素個數
如果待插入的元素num≤小頂堆的堆頂元素,則直接把num插入大頂堆中;
否則,彈出小頂堆的堆頂元素,並將其插入大頂堆,之後把num插入小頂堆。
(3) 大頂堆的元素個數 > 小頂堆的元素個數
如果待插入的元素num≥大頂堆的堆頂元素,則直接把num插入小頂堆中;
否則,彈出大頂堆的堆頂元素,並將其插入小頂堆,之後把num插入大頂堆。
時間複雜度:o(logn)。堆的插入刪除操作都是o(logn)。
空間複雜度:o(n) 。小頂堆和大頂堆一共同時儲存 n 個元素。
1力扣官方題解 - 資料流的中位數class
medianfinder
1011
/*始終保持兩個堆的大小之差不超過1
*/12
void addnum(int
num)
1920
if(num >=minheap.top()) else
2526 } else
if(maxheap.size()
3536 } else
else45}
46}4748
double
findmedian() else
if(maxheap.size()
57};
5859/**
60* your medianfinder object will be instantiated and called as such:
61* medianfinder* obj = new medianfinder();
62* obj->addnum(num);
63* double param_2 = obj->findmedian();
64*/
劍指 Offer 41 資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 示例...
《劍指offer》 41 資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 vo...
劍指Offer41 資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 輸入...