63 資料流中的中位數

2022-09-13 20:15:23 字數 900 閱讀 4165

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert()方法讀取資料流,使用getmedian()方法獲取當前讀取資料的中位數。

import

j**a.util.priorityqueue;

import

j**a.util.comparator;

public

class

solution

});public

void

insert(integer num)

else

count++;

}public

double getmedian()

else

}}

左邊:最大堆

右邊:最小堆

當資料總數為偶數時,新加入的元素,應當進入小根堆(注意不是直接進入小根堆,而是經大根堆篩選後取大根堆中最大元素進入小根堆)

1.新加入的元素先入到大根堆,由大根堆篩選出堆中最大的元素

2.篩選後的"大根堆中的最大元素"進入小根堆

當資料總數為奇數時,新加入的元素,應當進入大根堆(注意不是直接進入大根堆,而是經小根堆篩選後取小根堆中最大元素進入大根堆)

1.新加入的元素先入到小根堆,由小根堆篩選出堆中最小的元素

2.篩選後的"小根堆中的最小元素"進入大根堆

最大堆還可以用lamda表示式定義:

priorityqueuemaxheap=new priorityqueue<>((o1, o2) -> o2 - o1);

63 資料流中的中位數

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。思路 構造乙個最大堆和乙個最小堆,最大堆用來存放較小的那一半的資料,最小堆用來存放較大的那一半的資料,每次插入資料...

63資料流中的中位數

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。這個使用優先佇列的思路...

63 劍指offer 資料流中的中位數

題目描述 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值 解題思路 分為兩種情況,奇數取中間的數字,偶數取中間兩個數的平均值。使用兩個堆來實現,左側使用最大堆儲存...