zoukankan      html  css  js  c++  java
  • 剑指offer 63.数据流中的中位数

    剑指offer 63.数据流中的中位数

    题目

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

    思路

    我一开始的想法,是排序之后直接找,但是复杂度有点高。
    发现了一种新的方法,维持两个堆,一个最大堆,一个最小堆,确保最大堆的数都小于最小堆,两个堆的大小差距为1或0.
    如果两边数量相同的话,取最大堆的最大值和最小堆的最小值和的一半即可,如果不同,那么就是多的那个。
    java可以用优先队列,改一下比较器就可以了。

    代码

    
      int count = 0;
      PriorityQueue<Integer> minHeap = new PriorityQueue<>();
      PriorityQueue<Integer> maxHeap = new PriorityQueue<>((o1, o2) -> o2 - o1);
    
    
      public void Insert(Integer num) {
        if (count % 2 == 0) {
          maxHeap.offer(num);
          int filteredMaxNum = maxHeap.poll();
          minHeap.offer(filteredMaxNum);
        } else {
          minHeap.offer(num);
          int filteredMinNum = minHeap.poll();
          maxHeap.offer(filteredMinNum);
        }
        count++;
      }
    
      public Double GetMedian() {
        if (count % 2 == 0) {
          return new Double((minHeap.peek() + maxHeap.peek())) / 2;
        } else {
          return new Double(minHeap.peek());
        }
      }
    
  • 相关阅读:
    hdoj 1879 继续畅通工程
    hdoj 1233 还是畅通工程
    PAT-1107 Social Clusters (30 分)
    hdoj 1232 畅通工程
    POJ-3061 前缀和+二分搜索 模板题
    常见推荐系统框架
    常见的时间衰减函数
    英语中的五大基本句型
    如何获得excel文件名和工作表名
    记一次atomikos 连接池耗尽错误
  • 原文地址:https://www.cnblogs.com/blogxjc/p/12426588.html
Copyright © 2011-2022 走看看