如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
java:
1 import java.util.PriorityQueue; 2 import java.util.Comparator; 3 public class Solution { 4 /* 大顶堆,存储左半边元素 */ 5 private PriorityQueue<Integer> left = new PriorityQueue<Integer>((o1,o2)->o2-o1) ; 6 /* 小顶堆,存储右半边元素,并且右半边元素都大于左半边 */ 7 private PriorityQueue<Integer> right = new PriorityQueue<Integer>() ; 8 /* 当前数据流读入的元素个数 */ 9 private int N = 0 ; 10 11 public void Insert(Integer num) { 12 if (N%2 == 0){ 13 /* N 为偶数的情况下插入到右半边。 14 * 因为右半边元素都要大于左半边,但是新插入的元素不一定比左半边元素来的大, 15 * 因此需要先将元素插入左半边,然后利用左半边为大顶堆的特点,取出堆顶元素即为最大元素,此时插入右半边 */ 16 left.add(num) ; 17 right.add(left.poll()) ; 18 }else{ 19 right.add(num) ; 20 left.add(right.poll()) ; 21 } 22 N++ ; 23 } 24 25 public Double GetMedian() { 26 if (N%2==0){ 27 return (left.peek() + right.peek()) / 2.0 ; 28 }else{ 29 return (double)right.peek() ; 30 } 31 } 32 33 34 }