所以这里给出了一个数组 - array1,在[0,10000]中有N个正整数。 N可能高达10 ^ 8。 鉴于我们需要修复终点,具有最大平均值的连续子阵列是什么?
例如,让array1为[3,1,9,2,7]。由于我们确定了终点,因此平均值最大的子阵列为[9,2,7],平均值为6.
我尝试过纯粹的线性搜索,虽然Python在循环10 ^ 8循环方面很慢,所以它不是一个好的算法。
时间限制 - 时间限制为4秒。
编辑:我真的不想开始改进,所以任何提示都会受到赞赏。是否可以将其减少到O(log n)?澄清:最后一个元素需要在子数组中,子数组的长度需要> 1
答案 0 :(得分:0)
您可以使用itertools.combinations
执行此任务:
def sublists(l, minsize, endpoint):
# create empty list of all candidate sublists
# O(1)
candidates = []
# obtain the possible sublists
# O(n)
for start, end in combinations(range(len(l)), minsize):
# check if last element is the endpoint
# O(1)
if l[end] == endpoint:
# add sublist to the candidates
# O(1)
candidates.append(l[start:end+1])
# create tuple pairs (average, sublist)
# O(n)
pairs = [(sum(x) / len(x), x) for x in candidates]
# get max sublist
# O(n)
return max(pairs)[1]
其工作原理如下:
>>> print(sublists([3, 1, 9, 2, 7], 2, 7))
[9, 2, 7]
注意:上述算法为O(n)
。这是预期的,因为您需要创建列表的所有可能的连续组合以开始。我不认为你可以在O(logn)
时间内执行此算法,因为生成组合本身是O(n)
。如果您使用平衡BST,您可能会在O(logn)
时间内找到最大平均值,但这只适用于搜索部分,而不是整个算法。