我不断计算出一个子集的平均值

时间:2017-11-29 00:52:21

标签: python-3.x performance loops io

我有一段工作代码,但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)

任何建议都会很棒!

1 个答案:

答案 0 :(得分:2)

您可能需要避免在循环中执行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))