力扣做题20. 连续中值

这类型的题以前做过,二分法找中间值,算是温故知新吧

 

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

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

例如,

[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)
链接:https://leetcode.cn/problems/continuous-median-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * initialize your data structure here.
 */
var MedianFinder = function() {
    this.data=[]
};

/** 
 * @param {number} num
 * @return {void}
 */
MedianFinder.prototype.addNum = function(num) {
    const data=this.data;
    let left=0;
    let right=data.length;
    let mid=left;
    while(left<right){
        mid=(left+right)>>1;
        if(num>data[mid]){
            left=Math.max(mid,left+1);
        }else if(num<data[mid]){
            right=Math.min(mid,right-1);
        }else if(num===data[mid]){
            left=mid;
            right=mid;
        }
    }
    data.splice(left,0,num)
};

/**
 * @return {number}
 */
MedianFinder.prototype.findMedian = function() {
    const data=this.data;
    if(data.length%2===0){
        const mid=data.length/2;
        return (data[mid]+data[mid-1])/2
    }else{
        const mid=data.length>>1;
        return data[mid]
    }
};

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

 

posted @ 2022-09-26 12:05  无工时代  阅读(13)  评论(0编辑  收藏  举报