Skip to content

Latest commit

 

History

History
94 lines (72 loc) · 2.27 KB

File metadata and controls

94 lines (72 loc) · 2.27 KB

295. 数据流的中位数

相关标签

  • 设计
  • 双指针
  • 数据流
  • 排序
  • 堆(优先队列)

问题描述

  1. 数据流的中位数 - 中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。
  • 例如 arr = [2,3,4] 的中位数是 3 。
  • 例如 arr = [2,3] 的中位数是 (2 + 3) / 2 = 2.5 。

实现 MedianFinder 类:

  • MedianFinder() 初始化 MedianFinder 对象。

  • void addNum(int num) 将数据流中的整数 num 添加到数据结构中。

  • double findMedian() 返回到目前为止所有元素的中位数。与实际答案相差 10-5 以内的答案将被接受。

示例 1:

输入 ["MedianFinder", "addNum", "addNum", "findMedian", "addNum", "findMedian"] [[], [1], [2], [], [3], []] 输出 [null, null, null, 1.5, null, 2.0]

解释 MedianFinder medianFinder = new MedianFinder(); medianFinder.addNum(1); // arr = [1] medianFinder.addNum(2); // arr = [1, 2] medianFinder.findMedian(); // 返回 1.5 ((1 + 2) / 2) medianFinder.addNum(3); // arr[1, 2, 3] medianFinder.findMedian(); // return 2.0

提示:

  • -105 <= num <= 105
  • 在调用 findMedian 之前,数据结构中至少有一个元素
  • 最多 5 * 104 次调用 addNum 和 findMedian

题解

class MedianFinder {
    nums: number[]
    constructor() {
        this.nums = []
    }

    addNum(num: number): void {
        let left = 0;
        let right = this.nums.length -1
        while(left <= right) {
            const mid = Math.floor((left + right) /2)
            if(this.nums[mid] === num) {
                this.nums.splice(mid, 0, num)
                return 
            } else if(this.nums[mid] < num) {
                left = mid + 1
            } else {
                right = mid -1
            }
        }
        this.nums.splice(left, 0, num)
    }

    findMedian(): number {
        let len = this.nums.length 
        let mid = Math.floor(len /2)
        if(len % 2) {
            return this.nums[mid]
        } else {
            return (this.nums[mid] + this.nums[mid -1])/2
        }
    }
}

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