要求是输入将设置为-5到5之间的整数,结果应该给出整数的最长子集,其中总数必须大于或等于零。
我只能想出以下内容: 输入将输入[0到n]
let start, longestStart, end, longestEnd, sum = 0
for i=0 to n-1
start = i
sum = input[i]
for j=1 to n
if sum + input[j] >= 0 then
end=j;
if end - start > longestEnd - longestStart then
longestStart = start;
longestEnd = end;
然而,这是Θ(n ^ 2)。我想知道使这个循环成为Θ(n)的方法是什么 谢谢
答案 0 :(得分:0)
由于
a - b == (a + n) - (b + n)
对于任何a,b或n,我们可以将其应用于数字数组,使所有元素的运行总数从0保持为当前。根据上式,从索引a到b的任何子阵列的总和是sum(元素0-b) - sum(元素0-a)。
通过跟踪局部最小值和最大值及其总和,可以找到一次通过范围最大的子阵列,即O(n)。