题目描述
随机产生数字并传递给一个方法。你能否完成这个方法,在每次产生新值时,寻找当前所有值的中间值(中位数)并保存。
中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。
例如
[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()
*/