剑指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 }

 

posted @ 2019-09-07 19:53  chyblogs  阅读(149)  评论(0)    收藏  举报