[路飞]_算法_ 数据流的中位数——优先列表

146 阅读1分钟

题目描述

随机产生数字并传递给一个方法。你能否完成这个方法,在每次产生新值时,寻找当前所有值的中间值(中位数)并保存。

中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。

例如

[2,3,4] 的中位数是 3

[2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:

  • void addNum(int num) - 从数据流中添加一个整数到数据结构中。
  • double findMedian() - 返回目前所有元素的中位数。 示例:
addNum(1)
addNum(2)
findMedian() -> 1.5
addNum(3) 
findMedian() -> 2

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/co… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

添加时,按数大小优先级加入队列,维护一个从升序排列的队列 获取中值时,按照奇偶数情况计算中值

代码

var MedianFinder = function() {
    this.list=[];
};

/** 
 * @param {number} num
 * @return {void}
 */
MedianFinder.prototype.addNum = function(num) {
    for(let i=0;i<this.list.length;i++){
        if(this.list[i]>=num){
            this.list.splice(i,0,num)
            return;
        }
    }
    this.list.push(num);

};

/**
 * @return {number}
 */
MedianFinder.prototype.findMedian = function() {
    if(this.list.length==0) return 0;
    let center=this.list.length/2;
    if(center===parseInt(center)){
        //偶数
        return (this.list[center-1]+this.list[center])/2;
    }else{
        //奇数
        return this.list[parseInt(center)];
    }
};

/**
 * Your MedianFinder object will be instantiated and called as such:
 * var obj = new MedianFinder()
 * obj.addNum(num)
 * var param_2 = obj.findMedian()
 */