我们得到一个整数向量(V[]
)和两个索引值A
和B
。我们需要对V[A]
和V[B]
之间的所有整数求和。
例如,
V[] == {0, 1, 2, 0, 4, 0, 3}, A == 2, B == 6
Sum == V[3] + V[4] + V[5] == 4
是否有可能以O(1)
复杂度解决?
我考虑过使用内存地址操作,但我仍然不确定它是如何工作的(例如:将(B-A)
中的下一个&V[A]
地址值相加)
答案 0 :(得分:1)
如果允许预处理,可以使用辅助阵列完成此操作。
第二个数组的每个元素都包含相应元素和所有前面元素的总和。这种一次性预处理是O(n)时间和O(n)空间。
例如:
int Vsum[7];
Vsum[0] = V[0];
for (int i=1; i<7; i++) {
Vsum[i] = Vsum[i-1] + V[i];
}
因此,对于给定的数组,相应的求和数组Vsum
将包含:
{0, 1, 3, 3, 7, 7, 10}
一旦你有了这个,你只需要执行2次查找:一次用于上限,一次用于下限。因此,在预处理之后,每次执行时获得范围和为O(1)。
对于A == 2和B == 6的示例,您将计算Vsum[B-1] - Vsum[A]
== 7 - 3
== 4
答案 1 :(得分:-1)
O(1)空间:没问题。但是“随机”数字总是需要O(n)时间。