劍指Offer-其他-(7)
阿新 • • 發佈:2018-12-18
題目描述
如何得到一個數據流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用Insert()方法讀取資料流,使用GetMedian()方法獲取當前讀取資料的中位數。
import java.util.LinkedList; public class Solution { //目的如何得到一個數據流中的中位數 //使用Insert()方法讀取資料流 LinkedList<Integer> list = new LinkedList<Integer>(); //讀取資料就拍成了一個有序的連結串列 public void Insert(Integer num) { //分三種情況,最小值,放到連結串列首部。 if (list.size()==0||num < list.getFirst()) { list.addFirst(num); //下面是位於中間的,進行插入排序 } else { boolean insertFlag = false; for (Integer e : list) { if (num < e) { int index = list.indexOf(e); list.add(index, num); insertFlag = true; break; } } //大於所有的值,放到連結串列尾部 if (!insertFlag) { list.addLast(num); } } } public Double GetMedian() { if (list.size() == 0) { return null; } //是偶數個 if (list.size() % 2 == 0) { int i = list.size() / 2; Double a = Double.valueOf(list.get(i - 1) + list.get(i)); return a / 2; } //下面是奇數個 //list.get(0); //Double b = Double.valueOf(list.get((list.size() + 1) / 2 - 1)); return Double.valueOf(list.get(list.size() / 2 )); } }