找中位数

核心思想是搞两个堆,然后让数字在里面流动,每个堆存放一半的数据,0~100的话,就是0~50在左边的堆,是一个大堆,而51~100则是在右边的堆,是一个小堆,然后当左边和右边数据一样多的时候,新的数据应该插入左边的堆,然后挤出一个左边的大数到右边,这样的话,奇数个数字的时候,右边堆顶就是中位数;如果左右数据不一样多,那肯定是右边的数据多,那么就插入右边的堆,把右边堆的数字挤出一个到左边去,中位数等于两个堆顶的和

https://leetcode-cn.com/problems/shu-ju-liu-zhong-de-zhong-wei-shu-lcof/

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

class MedianFinder {
    private PriorityQueue<Integer> maxQueue = new PriorityQueue<>();//最大堆
    private PriorityQueue<Integer> minQueue = new PriorityQueue<>(new Comparator<Integer>() {
        @Override public int compare(Integer o1, Integer o2) {
            return o2-o1;
        }
    });//最小堆

    /** initialize your data structure here. */
    public MedianFinder() {
    }

    public void addNum(int num) {
        if(maxQueue.size() == minQueue.size()) {
            minQueue.add(num);
            maxQueue.add(minQueue.poll());
        } else {
            maxQueue.add(num);
            minQueue.add(maxQueue.poll());
        }
    }

    public double findMedian() {
        return minQueue.size() == maxQueue.size() ? (maxQueue.peek() + minQueue.peek()) / 2.0 : maxQueue.peek() ;
    }
}

  

原文地址:https://www.cnblogs.com/iamzhoug37/p/12969956.html