【发布时间】:2016-10-28 20:11:41
【问题描述】:
我们得到一个整数向量 (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] 相加)
【问题讨论】:
-
你认为这会怎样?
-
完全不可能。如果你想要 O(1) 访问范围和,你应该预处理你的数据并构建一个前缀和的向量或类似的东西。
-
通常当这个问题被问到时,上下文允许对输入进行预处理。 IE。你有一个从向量构造的类,然后是一个查询方法。唯一通常的要求是查询是O(1),但构造可以更多。
-
不,不是没有预处理。您可以简单地存储一个部分总和数组,其中 S[i] = 元素 0->i 的总和,因此您的答案将是
S[B] - S[A-1]... -
所以不是让其他人为您解决编程难题的服务。
标签: c++ algorithm vector time-complexity big-o