題目描述:
中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。
例如,[2,3,4] 的中位數是 3
[2,3] 的中位數是 (2 + 3) / 2 = 2.5
設計乙個支援以下兩種操作的資料結構:
void addnum(int num) - 從資料流中新增乙個整數到資料結構中。
double findmedian() - 返回目前所有元素的中位數。
示例:addnum(1)
addnum(2)
findmedian() -> 1.5
addnum(3)
findmedian() -> 2
題目分析:中位數的含義就不用解釋了吧,當然,這道題最簡單的做法就是對輸入的資料放到乙個有序的陣列裡面,然後再去取中位數,但是使用簡單排序的時間複雜度最好不過是o(nlogn),我們仍需要乙個比較好的解決方案。思考一下中位數的特點和位置,就是乙個有序陣列的最中間,因此可以把讀入的資料分為兩部分,比如
[1,2,3,4,5,6,7],分為1,2,3,4和5,6,7,此時中位數就是左部分的最大值,如果是偶數個,就是左部分的最大值和右部分的最小值的平均值。那麼就需要分成同時並維護2個陣列,取的時候能直接取到最值就十分舒服了,看到這裡,是不是想到了堆?對的,可以用乙個大頂堆和小頂堆,大頂堆是左邊部分,小頂堆是右邊部分,計算中位數的話,直接取堆頂元素就ok了。需要考慮的點就是這兩個堆的分配策略,要保證元素個數是相等的,或者左邊(右邊也可)多乙個即可。我們可以每次先把元素放入左邊,同時把左邊的堆頂元素放入右邊,一旦左邊個數小於右邊,就把右邊的堆頂元素放入左邊,這樣能保證左邊個數等於右邊或者多乙個,計算的時候直接取中位數即可
**:
public
class
medianfinder
}public
double
findmedian()
}
295 資料流的中位數
中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 示例 addnum 1 addnum 2 findmedian 1.5 addnum 3 findmedian 2...
295 資料流的中位數
中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 void addnum int num 從資料流中新增乙個整數到資料結構中。double findmedian 返...
295 資料流的中位數 C
中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 void addnum int num 從資料流中新增乙個整數到資料結構中。double findmedian 返...