zoukankan      html  css  js  c++  java
  • 64 数据流中的中位数

    如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。

    java:

     1 import java.util.PriorityQueue;
     2 import java.util.Comparator;
     3 public class Solution {
     4     /* 大顶堆,存储左半边元素 */
     5     private PriorityQueue<Integer> left = new PriorityQueue<Integer>((o1,o2)->o2-o1) ;
     6     /* 小顶堆,存储右半边元素,并且右半边元素都大于左半边 */
     7     private PriorityQueue<Integer> right = new PriorityQueue<Integer>() ;
     8     /* 当前数据流读入的元素个数 */
     9     private int N = 0 ;
    10 
    11     public void Insert(Integer num) {
    12        if (N%2 == 0){
    13             /* N 为偶数的情况下插入到右半边。
    14          * 因为右半边元素都要大于左半边,但是新插入的元素不一定比左半边元素来的大,
    15          * 因此需要先将元素插入左半边,然后利用左半边为大顶堆的特点,取出堆顶元素即为最大元素,此时插入右半边 */
    16            left.add(num) ;
    17            right.add(left.poll()) ;
    18        }else{
    19            right.add(num) ;
    20            left.add(right.poll()) ;
    21        }
    22         N++ ;
    23     }
    24 
    25     public Double GetMedian() {
    26         if (N%2==0){
    27             return (left.peek() + right.peek()) / 2.0 ;
    28         }else{
    29             return (double)right.peek() ;
    30         }
    31     }
    32 
    33 
    34 }
  • 相关阅读:
    Linux监控内核SNMP计数器
    wireshark使用手册
    【LinuxShell】echo用法详解
    【Coredump】调试之旅
    汇编指令
    从零开始学Java (五)条件选择
    从零开始学Java (四)输入输出
    Dart基础
    树相关
    递归简介
  • 原文地址:https://www.cnblogs.com/mengchunchen/p/10453673.html
Copyright © 2011-2022 走看看