找到O(n)解决方案来改变前缀和

时间:2015-09-29 14:19:04

标签: algorithm complexity-theory

Problem

我知道这个问题是前缀总和的变体,我只是在设置它时遇到了一些困难。

4 个答案:

答案 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中的最后一个)。