答案 0 :(得分:2)
计算两个数组怎么样: Lefts [i]将等于第一个i元素的总和,:
Lefts[i] = A[0]+A[1]+A[2]..+A[i]
和Rights [i]将等于最后i个元素的总和:
Rights[i] = A[n-1]+A[n-2]..+A[i]
然后S[i] = Left[i-1]+Rigt[i+1]
。
答案 1 :(得分:2)
定义:
P[i] = A[i+1] + A[i+2] + ... + A[n]
Q[i] = A[1] + ... + A[i-1]
然后,S[i] = P[i] + Q[i]
答案 2 :(得分:1)
我提出的想法归结为其他答案中已经提出的建议。但是,我想提出一个具有恒定内存开销的实现:
initialize S with 0
for i = 2 to n {
S[i] = S[i -1] + A[i - 1] // somewhat similar to prefix sum array
}
help = 0 // a single variable - constant memory overhead
for i = n to 1 {
S[i] += help
help += A[i]
}
在第一次迭代之后,S [i]存储索引小于i的所有值的总和。在第二次迭代中,我在当前值的右侧添加值的总和。
答案 3 :(得分:1)
定义B [i] = A [1] + ... A [i-1]和C [i] = A [i + 1] + ... + A [n]然后S [i] = B [i] + C [i]。
您可以在线性时间内计算两个数组。您需要向后迭代以在线性时间内计算C.
添加总数为3N - 2(每个位置增加一个,预计B中的第一个和C中的最后一个)。