剑指 offer第41.1题-数据流中的中位数

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。

import java.util.Comparator;
import java.util.PriorityQueue;

public class Solution {

    /* 小顶堆,存储右半边元素,并且右半边元素都大于左半边 */
    private PriorityQueue minHeap=new PriorityQueue<>();
    /* 大顶堆,存储左半边元素 */
    private PriorityQueue maxHeap=new PriorityQueue<>((o1, o2) -> o2 - o1);
    /* 当前数据流读入的元素个数 */
    private int count=0;
    
    public void Insert(Integer num) {
        //位运算判断偶数
        if((count&1)==0){
                maxHeap.add(num);
                minHeap.add(maxHeap.poll());
        }else{
                minHeap.add(num);
                maxHeap.add(minHeap.poll());
        }
        count++;
    }

    public Double GetMedian() {
        //位运算判断奇数
        if((count&1)!=0){
            return (double)minHeap.peek();
        }else{
            return (minHeap.peek()+maxHeap.peek())/2.0;
        }
    }
}

位运算判断奇偶数,
(nums&1)==0?“偶数”:“奇数”)

你可能感兴趣的:(算法题,剑指,offer)