I'm trying to solve a problem which reads as follows:

一队Eager 的个位数(您的输入)正在等待进入一个空房间.

我每分钟允许一个数字(从左起)进入房间.

每次有新的数字进入房间,我都会在黑板上记下当前房间里所有数字的中位数.[当数字按升序排列时,中位数是中间数字.]如果有两个中位数(即两个中位数),那么我不使用平均值,而是记下两个中位数中较低的一个.

我用粉笔在现有数字的右边画上新数字,这样我的黑板号码就会变得越来越长.

当所有的数字都在房间里时,你的黑板上会出现什么数字?

考虑一下示例输入:21423814127333

  • 2(最左边)被允许进入房间,因为它是唯一的数字,所以我在黑板上写了2.
  • 然后允许1进入房间加入2.这两个中较小的一个被用作中间值,所以我在黑板上2的右边写下了1(我的数字现在是21)
  • 4现在进入房间.1、2和4的中位数是2,所以我在黑板上加了2(我的数字现在是212)
  • ...这个过程一直持续到最后3个人进入房间...所有的数字现在都在房间里,排序后是1,1,1,2,2,3,3,3,3,3,4,7,8,8.有两个中位数,但它们都是3,所以我在黑板上加上3,最后的数字是21222222222233

My current solution:

num = input()
new = str(num[0])
whole = [num[0]]

for i in range(1, len(num)):
    whole.append(num[i])
    whole.sort()
    new += whole[i//2]

print(new)

问题是它花的时间太长--所以它通过了6/10(隐藏的)测试用例,但超过了其他4个测试用例的时间限制.任何帮助都将不胜感激.

推荐答案

你在重复排序, 通过关键比对, 因此总成本为O(N*N log N), 也就是说,它至少是二次的.

个位数(您的输入)正在等待输入

解决这个问题的关键是输入的范围限制. 我们知道每个输入x都在这个范围内:

0 <= x < 10

使用counters. 我们可以很容易地分配其中的10个.

对已设置的总位数进行连续计数 被允许进入房间. 每次你必须报告中位数时,计算 sum个 有秩序的柜台,当你得到 只占总数的一半.

max_val = 10
counter = {i: 0  for i in range(max_val)}
...
assert 0 <= input_val < max_val

counter[input_val] += 1

cum_sum = 0
for i in range(max_val):
    cum_sum += counter[i]
    ...

由于中位数是一个稳健的统计数据, 通常情况下,会有一些 solidity 在中位数中,您报告,例如"2,1,2,2,2,2". 您可以使用它来加快计算速度 更进一步,通过递增计算 累计总和. 但这不会改变巨大的--哦,复杂性, 因为柜台的数量是恒定的. 我们仍在关注O(N),因为我们必须 判断进入房间的N位数字,然后报告当前的中位数. 这does%的成本超过了以下方法的O(N LogN)成本 依赖于将有序向量一分为二.

Python相关问答推荐

将行从一个DF添加到另一个DF

剧作家Python没有得到回应

Chatgpt API不断返回错误:404未能从API获取响应

如何在Deliveryter笔记本中从同步上下文正确地安排和等待Delivercio代码中的结果?

如何使用pandasDataFrames和scipy高度优化相关性计算

rame中不兼容的d类型

如何让剧作家等待Python中出现特定cookie(然后返回它)?

ModuleNotFound错误:没有名为flags.State的模块; flags不是包

如何使用LangChain和AzureOpenAI在Python中解决AttribeHelp和BadPressMessage错误?

PMMLPipeline._ fit()需要2到3个位置参数,但给出了4个位置参数

根据二元组列表在pandas中创建新列

如何获得每个组的时间戳差异?

如何从数据库上传数据到html?

当递归函数的返回值未绑定到变量时,非局部变量不更新:

合并与拼接并举

如何在Gekko中使用分层条件约束

jsonschema日期格式

Pandas 数据帧中的枚举,不能在枚举列上执行GROUP BY吗?

numpy数组和数组标量之间的不同行为

裁剪数字.nd数组引发-ValueError:无法将空图像写入JPEG