当我阅读the answer for the former question时!在堆栈溢出时,它表示有可能解决O(n)的Maximum Sum Sublist。
我还编写了计算复杂度为O(n ^ 2)的代码。
但是,我听说有一种算法可以解决O(n ^ 3)的最大和子列表。
如果您知道的话,请与我分享。
O(n)的代码
def mssl(l):
best = cur = 0
for i in l:
cur = max(cur + i, 0)
best = max(best, cur)
return best
O(n ^ 2)的代码
def solution(A):
start = None
end = None
max_total = 0
for i in range(len(A)):
for j in range(i, len(A)):
tmp = sum(A[i:j+1])
if max_total < tmp:
max_total = tmp
start = i
end = j
return max_total, start, end
if __name__ == '__main__':
A = [18, -10, 30, 23, -26]
ans = solution(A)
print(ans)
我想知道任何一种算法可以解决O(n ^ 3)的最大和子列表。
答案 0 :(得分:0)
A[i:j+1]
这部分复制了j + 1 - i
个元素。
for j in range(i, len(A)):
j从i到n − 1(包括n = {len(A)
)的j +1-i之和为:
将它们放在一起,您将得到n²/ 2 − n / 2 +i²/ 2 − i / 2 + n − i − in +i²= n²/ 2 + n / 2 + 3/2i²− (n + 3/2)i 复制到j循环。
for i in range(len(A)):
i从0到l − 1的n²/ 2 + n / 2 + 3/2i²−(n + 3/2)i的总和是:
即为n³/ 2 +n²/ 2 +n³/ 2-n²/ 4-n / 4-n³/ 2-n²/ 4 + 3n / 4 = n³/ 2 + n / 2份< / strong>,对于典型的O(n ^ 3)时间复杂度测量,而不是O(n ^ 2)。
(健全性检查:n³+ n / 2始终是整数。)