力扣labuladong一刷day55天求中位数

力扣labuladong一刷day55天求中位数

一、295. 数据流的中位数

题目链接:https://leetcode.cn/problems/find-median-from-data-stream/description/?utm_source=LCUS&utm_medium=ip_redirect&utm_campaign=transfer2china
思路:求数据流中的中位数,想要在时间复杂度低的情况下完成,可以使用一种巧妙的方法,即使用两个优先级队列,一个大顶堆,一个小顶堆,大顶堆的堆顶小于小顶堆的堆顶,每次添加元素要维持两堆size大小相差不超过1,想往大顶堆添加元素,就要先往小顶堆添加,然后把小顶堆的堆顶给大顶堆。想往小顶堆填加元素,就要先往大顶堆添加元素,然后把大顶堆的堆顶给小顶堆。如此中位数就在堆顶。

class MedianFinder {
        PriorityQueue<Integer> bigTopHeap;
        PriorityQueue<Integer> smallTopHeap;
        public MedianFinder() {
            bigTopHeap = new PriorityQueue<>((a, b) -> b - a);
            smallTopHeap = new PriorityQueue<>();
        }

        public void addNum(int num) {
            if (bigTopHeap.size() >= smallTopHeap.size()) {
                bigTopHeap.add(num);
                smallTopHeap.add(bigTopHeap.poll());
            }else {
                smallTopHeap.add(num);
                bigTopHeap.add(smallTopHeap.poll());
            }
        }

        public double findMedian() {
            if (bigTopHeap.size() > smallTopHeap.size()) {
                return bigTopHeap.peek();
            } else if (bigTopHeap.size() < smallTopHeap.size()) {
                return smallTopHeap.peek();
            }
            return (bigTopHeap.peek()+smallTopHeap.peek())/2.0;
        }
    }

你可能感兴趣的:(力扣算法题,leetcode,数据库,算法)