zoukankan      html  css  js  c++  java
  • 剑指offer:数据流中的中位数(小顶堆+大顶堆)

    1. 题目描述

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

    2. 思路

      /**  最大堆和最小堆
          * 每次插入小顶堆的是当前大顶堆中最大的数
          * 每次插入大顶堆的是当前小顶堆中最小的数
          * 这样保证小顶堆中的数永远大于等于大顶堆中的数(值)
          * 中位数就可以方便地从两者的根结点中获取了
          * 奇数的话 小根堆中的元素数 大于 大根堆中的元素数(数量)
          */

    3. 代码

    import java.util.PriorityQueue;
    import java.util.Comparator;
    public class Solution {
        //小顶堆
        private PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
        //大顶堆
        private PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        });
         
        //记录元素个数偶数个还是奇数个
        int count = 0;
        public void Insert(Integer num) {
            /**个数为偶数的话,则先插入到大顶堆,然后将大顶堆中最大的数插入小顶堆中*/
            //保证了先放入小根堆,在放入大根堆
            if(count % 2 == 0){
                maxHeap.offer(num);
                int max = maxHeap.poll();
                minHeap.offer(max);
            }else{
                /**个数为奇数的话,则先插入到小顶堆,然后将小顶堆中最小的数插入大顶堆中*/
                minHeap.offer(num);
                int min = minHeap.poll();
                maxHeap.offer(min);
            }
            /**插入一个,数量增加一个*/
            count++;
        }
        public Double GetMedian() {
            if(count % 2 == 0){
                /**当前为偶数个,则取小顶堆和大顶堆的堆顶元素求平均*/
                return new Double(minHeap.peek() + maxHeap.peek())/2;
            }else{
                /**当前为奇数个,则直接从小顶堆中取元素即可*/
                return new Double(minHeap.peek());
            }
        }
    }
  • 相关阅读:
    mysql 索引学习笔记
    mysql mysqli pdo学习总结
    Flask-Login的实现
    Flask配置方法
    Flask-SQLAlchemy使用方法
    alpha阶段绩效考核
    Alpha版本后的心得体会
    代码及数据库展示
    功能简介
    最新的用户需求分析
  • 原文地址:https://www.cnblogs.com/haimishasha/p/11520748.html
Copyright © 2011-2022 走看看