Menu
CoddyTech

Find Median from Data Stream

困难堆python iconjava iconcpp iconc iconjs icon+10

设计一个包含两个操作的数据结构:addNum 用于存储一个整数,findMedian 用于返回目前存储的所有值的中位数。奇数个值的中位数是中间的值;偶数个值的中位数是中间两个值的平均值。

操作 i 是 ops[i],其中 values[i] 在操作为 addNum 时保存对应的数字,在操作为 findMedian 时保存 0。在一个空数据结构上按顺序运行这些操作,并为每个操作返回一个字符串:addNum 返回 "null",findMedian 返回中位数。中位数的表示形式如 "3"、"2.5" 或 "-0.5":整数不带小数点,零写作 "0",绝不写作 "-0"。

函数

medianStreamOps(ops: string-array, values: integer-array) → string-array
opsstring-array
这些操作按运行顺序排列
valuesinteger-array
每个 addNum 对应的数字,每个 findMedian 对应 0
返回值string-array
每次操作对应一个答案,格式为文本

约束条件

  • 1 ≤ ops.length ≤ 3000
  • values.length == ops.length
  • 每个 ops[i] 都是 addNum 或 findMedian。
  • -105 ≤ values[i] ≤ 105 对于 addNum,而对于 findMedian,values[i] == 0。
  • findMedian 只有在至少调用过一次 addNum 后才会被调用。

示例

输入
ops = ["addNum", "findMedian", "addNum", "findMedian", "addNum", "findMedian", "addNum", "findMedian"]values = [5, 0, 1, 0, 8, 0, 3, 0]
输出
["null", "5", "null", "3", "null", "5", "null", "4"]
解释
对于 1 和 5,中位数是 (1 + 5) / 2 = 3。对于 1、5 和 8,中位数是 5;对于 1、3、5 和 8,中位数是 (3 + 5) / 2 = 4。
challenge icon

进阶

如果每个值都在 0 到 100 之间,你怎样才能让这两种操作都在常数时间内运行?

重置代码
def medianStreamOps(ops, values):
    # 在这里编写代码

测试 #1

测试 #2

参数

ops = ["addNum", "findMedian", "addNum", "findMedian", "addNum", "findMedian", "addNum", "findMedian"]
values = [5, 0, 1, 0, 8, 0, 3, 0]

预期输出

["null", "5", "null", "3", "null", "5", "null", "4"]