在数组中找到一个索引,在它之前和之后给出一个总和?

时间:2012-05-28 16:47:41

标签: c++ algorithm

给定一个数组,我想找到一个索引,它前面的数字和它之后的数字给出相等的总和。

例如像数组一样 [4,5,6,11,7,8]

输出是索引3,因为4+5+6 = 7+8

3 个答案:

答案 0 :(得分:3)

首先查找所有项目的总和,将其保存为sum,然后从数组的开头读取并总结项目以到达(sum - current index value)/2,如果没有得到这样的结果,则意味着没有这样的索引,如果你在每个迭代索引中得到sum/2,意味着相关索引就是你的答案。

示例:4,5,6,11,7,8 sum = 41。

check index 0: currentSum  = 4, currentSum - currentValue = 4-4 != (41 - 4)/2
check index 1: currentSum  =  9, currentSum - currentValue = 9-5 != (41 - 5)/2
check index 2: currentSum  = 15, currentSum - currentValue = 15-6 != (41 - 6)/2
check index 3: currentSum  = 26, currentSum - currentValue = 15 == (41 - 11)/2

答案 1 :(得分:1)

创建(包含)前缀sum数组(这需要O(n)步)

然后,对于每个索引0 < i < n,检查是否prefixsum[i - 1] == prefixsum[n - 1] - prefixsum[i],如果i则返回true。 (也需要O(n)步)。


您可以更轻松地完成此任务(并减少空间):

计算数组的总和。为O(n)

然后,通过数组,跟踪前缀sum(独占,此时)。比较prefixsum == sum - (prefixsum + current)。如果为true,则返回当前索引。 O(n)。

基本上它与上面相同,但避免在数组中保存前缀和。

答案 2 :(得分:0)

尝试构建范围总和段树?检查每个节点,如果他们的左/右孩子相等,则返回它的索引。也许是矫枉过正。