剑指offer_数据流中的中位数
题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
方法一:就是直接排序取中间
1 import java.util.*; 2 public class Solution { 3 int N = 0; 4 ArrayList<Integer> list = new ArrayList<>(); 5 public void Insert(Integer num) { 6 list.add(num); 7 N++; 8 } 9 10 public Double GetMedian() { 11 Collections.sort(list); 12 if(N%2!=0) 13 return list.get(N/2)/1.0; 14 else 15 return (list.get(N/2)+list.get(N/2-1))/2.0; 16 } 17 }
方法二:大顶堆存储左半边元素,小顶堆存储右半边元素,并且右半边元素都大于左半边。
插入要保证两个堆存于插入到右半边。因为右半边的元素都要大于左半边,但是新插入的元素不一定比左半边元素来的大,因此需要先将元素插入左半边,然后利用左半边为大顶堆的特点,取出对顶元素即为最大元素

1 import java.util.*; 2 public class Solution { 3 private PriorityQueue<Integer> left = new PriorityQueue<>((o1,o2)->o2-o1); 4 private PriorityQueue<Integer> right = new PriorityQueue<>(); 5 private int N=0; 6 public void Insert(Integer num) { 7 if(N%2 == 0){ 8 left.add(num); 9 right.add(left.poll()); 10 }else{ 11 right.add(num); 12 left.add(right.poll()); 13 } 14 N++; 15 } 16 17 public Double GetMedian() { 18 if(N%2==0){ 19 return (left.peek()+right.peek())/2.0; 20 } 21 else{ 22 return right.peek()/1.0; 23 } 24 } 25 26 27 }

浙公网安备 33010602011771号