【问题标题】:I keep timing out calculating the mean of a subset我一直超时计算子集的平均值
【发布时间】:2018-05-12 14:31:53
【问题描述】:

我有一个工作代码块,但是 HackerEarth 上的在线法官一直返回一个计时错误。我是编码新手,所以我不知道加快代码速度的技巧。任何帮助将不胜感激!

N, Q = map(int, input().split())
#N is the length of the array, Q is the number of queries
in_list =input().split()
#input is a list of integers separated by a space
array = list(map(int, in_list))
from numpy import mean
means=[]
for i in range(Q):
   L, R = map(int, input().split())
   m= int(mean(array[L-1:R]))
   means.append(m)

for i in means:
    print(i)

任何建议都会很棒!

【问题讨论】:

    标签: python-3.x performance loops io


    【解决方案1】:

    您可能需要避免在循环中执行O(N) 操作。目前,切片和mean 调用(需要总结切片中的项目)都那么慢。所以你需要一个更好的算法。

    我建议您对数字列表进行一些预处理,以便找出切片中将是的值的总和(无需实际进行切片并添加它们向上)。通过使用O(N)空间,您可以在O(1)时间计算每个和(使整个过程花费O(N + Q)时间而不是O(N * Q))。

    这是我整理的一个快速解决方案,使用itertools.accumulate 查找列表项的累积总和。我自己并没有实际保存项目,因为累积起来就足够了。

    from itertools import accumulate
    
    N, Q = map(int, input().split())
    sums = list(accumulate(map(int, input().split())))
    
    for _ in range(Q):
        L, R = map(int, input().split())
        print((sums[R] - (sums[L-1] if L > 0 else 0)) / (R-L+1))
    

    【讨论】:

    • 感谢您的快速响应!我正在寻找提示,但我什至不知道如何开始这样做。切片似乎是快速程序的死亡,因此弄清楚如何在不切片的情况下进行切片将非常有帮助。
    • 我已经用一个实际的解决方案更新了我的答案,如果你自己还在解决这个问题,你可能想跳过。
    • 非常感谢!这真的很有帮助。
    猜你喜欢
    • 2019-01-27
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2013-01-14
    相关资源
    最近更新 更多