劍指 Offer 41 資料流中的中位數

2022-06-11 16:18:19 字數 1787 閱讀 6445

將數字儲存在可調整大小的容器中。每次需要輸出中間值時,對容器進行排序並輸出中間值。

時間複雜度: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 設計乙個支援以下兩種操作的資料結構 輸入...