查找具有固定结束和任意长度的最大平均值的子阵列

时间:2017-12-19 02:41:12

标签: python algorithm

所以这里给出了一个数组 - 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

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)时间内找到最大平均值,但这只适用于搜索部分,而不是整个算法。