序列的平衡指数是指数,使得较低指数处的元素之和等于较高指数处的元素之和。例如,在序列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。假设序列可能很长。
答案 0 :(得分:6)
A
i
,计算从A[0]
到A[i - 1]
的元素总和,直到总和等于(totalSum - A[i]) / 2
。请注意,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
)。
因此,对于i
到0
的每个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