在指定长度Python 3.5的O(n ^ 2)下找出正整数列表中的子列表的最大总和

时间:2017-03-23 12:21:54

标签: python algorithm sublist maximize

对于我的一个编程问题,我需要定义一个接受两个变量的函数,一个长度为l的列表和一个整数w。然后我必须找到列表中长度为w的子列表的最大总和。

条件:

1·; = W< = 1< = 100000

列表中的每个元素的范围都是[1,100]

目前,我的解决方案适用于O(n ^ 2)(纠正我,如果我错了,下面附带代码),自动编程器不接受,因为我们需要找到一个更简单的解决方案。

我的代码:

def find_best_location(w, lst):
    best = 0
    n = 0
    while n <= len(lst) - w:
        lists = lst[n: n + w]
        cur = sum(lists)
        best = cur if cur>best else best
        n+=1

    return best

如果有人能够找到更有效的解决方案,请告诉我!另外,如果我错误地计算了我的大O符号,也请告诉我!

提前致谢!

2 个答案:

答案 0 :(得分:2)

1)找出第一个current元素的总和w,将其分配给best
2)从i = w开始:current = current + lst[i]-lst[i-w]best = max(best, current) 3)完成。

答案 1 :(得分:2)

您的解决方案确实是O(n^2)(如果您想要更严格的约束,则为O(n*W)

您可以通过创建辅助数组sums在O(n)中执行此操作,其中:

sums[0] = l[0]
sums[i] = sums[i-1] + l[i]

然后,通过迭代并检查sums[i] - sums[i-W],您可以在线性时间内找到解决方案

你甚至可以动态计算sums阵列以减少空间复杂度,但如果我是你,我会从它开始,看看我是否可以升级我的解决方案。