題目描述
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。
解題思路
由於是資料流,也就是說輸入是動態變化的,所以資料結構最好選用動態陣列,arraylist比較合適。在計算中位數前對集合進行排序,然後返回中位數即可。
**實現
public
class
solution
public double getmedian() else
}}
優化方法
上述方法雖然簡單,但是對於每一次計算中位數都需要將陣列進行排序,因而時間複雜度較高,即 n * nlog(n)。
那麼,有什麼辦法可以使得排序的時間複雜度變低呢?我們想到了堆這個資料結構。當資料流中的數為偶數個時,入最小堆,但是先入最大堆,將最大堆中堆頂的資料取出,放入最小堆中。當資料流中的資料為奇數個時,入最大堆,但是先入最小堆,將最小堆堆頂的資料取出,放入最大堆中。
這樣,最大堆中的資料都比最小堆中的資料小,並且最大堆中堆頂元素與最小堆堆頂元素是排序後資料中間相鄰的兩個數。當資料流中的資料為奇數個時,直接取最小堆堆頂的元素,為偶數個時,取最大堆與最小堆堆頂元素的平均值。
**實現
public
class
optimizesolution
});private
int count = 0;
public
void
insert(int num) else
count++;
}public double getmedian() else
}public
static
void
main(string args)
}
劍指offer 資料流中的中位數
題目描述 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。實現 public class getmediannum listnode in new listnod...
劍指Offer 資料流中的中位數
題目描述 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。思路整理 這個題目要解出來很簡單,但是這裡有乙個比較好的思路 用最大和最小堆來實現,就像乙個沙漏一樣,上...
劍指offer 資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。資料流中的資料需要用合...