LeetCode:面试题 17.20. 连续中值(难度:🌟🌟🌟🌟)

89 阅读2分钟

一、前言🌟

哈喽,小伙伴们,我是泽南👨‍🎓。不管你是准备跳槽还是在职苟着,都一起行动起来,顺应这个内卷时代干点该干的事儿👣。所以,赶紧跟着我的步伐卷起来吧⏰,变强从这一刻开始!➕🧈

二、题目介绍🌟

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

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

例如,

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

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

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

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

示例 1:

addNum(1)
addNum(2)
findMedian() -> 1.5
addNum(3) 
findMedian() -> 2

解法一 :优先列表

解题思路:

添加时,按数大小优先级加入队列, 获取中值时,计算中间数

/**
 * initialize your data structure here.
 */
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()
 */

解法二 :push数组,排序

解题思路:

生成一个空的数组队列,增加数字通过push,取值时需排序

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

/** 
 * @param {number} num
 * @return {void}
 */
MedianFinder.prototype.addNum = function(num) {
    this.item.push(num)
};

/**
 * @return {number}
 */
MedianFinder.prototype.findMedian = function() {
    (this.item).sort(function(a , b){
        return a - b
    })
    if( (this.item.length) % 2 == 0 ){
        return ( (this.item)[ this.item.length / 2 ] + (this.item)[this.item.length / 2 - 1 ] ) / 2
    }else{
        return (this.item)[ (this.item.length - 1) / 2 ]
    }
};

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

最后🌟:

☘️做你想做的人,没有时间限制,只要愿意,什么时候都可以start,

🍀你能从现在开始改变,也可以一成不变,这件事,没有规矩可言,你可以活出最精彩的自己。