剑指 Offer 41. 数据流中的中位数

82 阅读1分钟

剑指 Offer 41. 数据流中的中位数

代码实现如下: 难点是 建立一个有序的数组,当数组有值时候,如果数组中最小值大于等于新增值 ,则插入最前面,如果数组中最大值小于等于新增值,则插入到最后面。 其他情况就是插入已知数组中间了,于是遍历数组,arr[i] <= num && arr[i+1] && arr[i+1] >= num 满足条件了,则直接插入符合条件的所在位置即可


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

MedianFinder.prototype.addNum = function(num) {
  var arr = this.arr
  if(arr.length>0){
      if(arr[0] >= num){
          arr.unshift(num)
          return
      }
      if(arr[arr.length-1] <= num){
        arr.push(num)
        return 
      }
      for(var i=0;i<arr.length;i++){
          if(arr[i] <= num && arr[i+1] && arr[i+1] >= num){
              arr.splice(i+1,0,num)
              return 
          }
      }
  }else{
      arr.push(num)
  }
};

MedianFinder.prototype.findMedian = function() {
  var arr = this.arr
  console.log(arr);
  var ou = arr.length % 2 == 0
  var i = arr.length >> 1
  if(ou){
      return (arr[i-1] + arr[i]) / 2
  }else{
      return arr[i]
  }
};

调试 新增下面代码

var m = new MedianFinder()

m.addNum(6)
console.log(m.findMedian(),6);
m.addNum(10)
console.log(m.findMedian(),8);
m.addNum(2)
console.log(m.findMedian(),6);
m.addNum(6)
console.log(m.findMedian(),6);
m.addNum(5)
console.log(m.findMedian(),6);
m.addNum(0)
console.log(m.findMedian(),5.5);
m.addNum(6)
console.log(m.findMedian(),6);
m.addNum(3)
console.log(m.findMedian(),5.5);
m.addNum(1)
console.log(m.findMedian(),5);
m.addNum(0)
console.log(m.findMedian(),4);
m.addNum(0)
console.log(m.findMedian(),3);