• 数据流中的中位数


    题目:

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

    解答:

     1 public class Solution {
     2 
     3     private ArrayList<Integer> res = new ArrayList<>();
     4 
     5     public void Insert(Integer num) {
     6         res.add(num);
     7         Collections.sort(res);
     8     }
     9 
    10     public Double getMedian() {
    11         int size = res.size();
    12         if(size % 2 == 0) {
    13             return Double.valueOf((res.get(n/2) + res.get(n/2-1)) / 2.0);
    14         } else {
    15             return Double.valueOf(res.get(n/2));
    16         }
    17     }
    18 }

    方法2

    1. 根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆。
    2. 根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆。
     1 //解法二:使用大堆和小堆的特性
     2 import java.util.Comparator;
     3 import java.util.PriorityQueue;
     4 public class Solution {
     5 
     6     private int count = 0;
     7     private PriorityQueue<Integer> minHeap = new PriorityQueue<>();
     8 
     9     private PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(15, new Comparator<Integer>() {
    10         public int compare(Integer o1, Integer o2) {
    11             return o2 - o1;
    12         }
    13     });
    14 
    15     public void Insert(Integer num) {
    16         if (count %2 == 0) {
    17             //当数据总数为偶数时,新加入的元素,应当进入小根堆
    18 
    19             //(注意不是直接进入小根堆,而是经大根堆筛选后取大根堆中最大元素进入小根堆)
    20             //1.新加入的元素先入到大根堆,由大根堆筛选出堆中最大的元素
    21             maxHeap.offer(num);
    22             int filteredMaxNum = maxHeap.poll();
    23              //2.筛选后的【大根堆中的最大元素】进入小根堆
    24              minHeap.offer(filteredMaxNum);
    25         } else {
    26             //当数据总数为奇数时,新加入的元素,应当进入大根堆
    27             
    28             //(注意不是直接进入大根堆,而是经小根堆筛选后取小根堆中最大元素进入大根堆)
    29             //1.新加入的元素先入到小根堆,由小根堆筛选出堆中最小的元素
    30             minHeap.offer(num);
    31             int filteredMinNum = minHeap.poll();
    32              //2.筛选后的【小根堆中的最小元素】进入大根堆
    33              maxHeap.offer(filteredMinNum);
    34         }
    35         count++;
    36     }
    37 
    38 
    39     public Double GetMedian() {
    40         if (count %2 == 0) {
    41             return new Double((minHeap.peek() + maxHeap.peek())) / 2;
    42          } else {
    43             return new Double(minHeap.peek());
    44         }
    45     }
    46 }
  • 相关阅读:
    synchronized内置锁
    《JavaScript闯关记》视频版硬广
    想提高团队技术,来试试这个套路!
    从国企到阿里的面试经历(二)
    从国企到阿里的面试经历(一)
    《JavaScript 闯关记》之垃圾回收和内存管理
    《JavaScript 闯关记》之原型及原型链
    《JavaScript 闯关记》之作用域和闭包
    如何排版 微信公众号「代码块」之 MarkEditor
    《JavaScript 闯关记》之事件
  • 原文地址:https://www.cnblogs.com/wylwyl/p/10471324.html
Copyright © 2020-2023  润新知