什么是用于此问题的最佳算法

时间:2011-01-05 22:43:47

标签: algorithm language-agnostic math

序列的平衡指数是指数,使得较低指数处的元素之和等于较高指数处的元素之和。例如,在序列A:

A[0]=-7 A[1]=1 A[2]=5 A[3]=2 A[4]=-4 A[5]=3 A[6]=0

3是均衡指数,因为:

A[0]+A[1]+A[2]=A[4]+A[5]+A[6]

6也是一个均衡指数,因为:

A[0]+A[1]+A[2]+A[3]+A[4]+A[5]=0

(零元素之和为零)7不是均衡指数,因为它不是序列A的有效索引。 如果你仍有疑问,这是一个精确的定义:当且仅当和时,整数k是一个序列的均衡指数。

假设零元素的总和等于零。写一个函数

int equi(int[] A);
给定序列的

,如果不存在均衡指数,则返回其均衡指数(任意)或-1。假设序列可能很长。

4 个答案:

答案 0 :(得分:6)

  1. 计算A
  2. 中所有元素的总和
  3. 对于每个索引i,计算从A[0]A[i - 1]的元素总和,直到总和等于(totalSum - A[i]) / 2
  4. 请注意,A[0]A[i - 1]的元素总和可以作为运行总计进行跟踪,这意味着整个算法的复杂度为O(n)。实现代码留给读者练习。

答案 1 :(得分:1)

这是一个使用O(n)内存的解决方案。计算S[i] = A[0] + A[1] + ... + A[i]。然后,子序列[i, j]的总和为Sum(i, j) = S[j] - S[i - 1]S[x < 0] = 0)。

因此,对于i0的每个A.Length - 1,请检查Sum(0, i - 1) = Sum(i + 1, A.Length - 1)

事实上,如果您被允许销毁给定的数组,您甚至不需要S,您可以在A中完成所有操作。

答案 2 :(得分:1)

伪代码 - 最坏的情况是2次通过A。

R = sum(A)
L = e = 0
for i = 0 .. A.size
  L+=e
  R-=(e=A[i])
  return i if L==R
end
return NULL

答案 3 :(得分:0)

  

a =( - 7,1,5,2,-4,3,0)

     

sumleft = 0

     

sumright = 0

     

表示范围内的i(len(a)):

for j in range(i+1,len(a)):

    sumright += a[j]

if sumright == sumleft:

    print i

sumleft += a[i]

sumright = 0