Algorithm 给定序列的平衡指数:找到平衡指数的最佳算法是什么?
序列的平衡指数是一个指数,使得较低指数的元素之和等于较高指数的元素之和。例如,在序列a中:Algorithm 给定序列的平衡指数:找到平衡指数的最佳算法是什么?,algorithm,language-agnostic,math,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] A[0]+A[1]+A[2]+A[3]+A[4]+A[5]=0 6也是一个平衡指数,因为: A[0]+A[1]+A[2]=A[4]+A[5]+A[6] A[0]+A[1]+A[2]+A[3]+A[4]+A[5]=
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]
A[0]+A[1]+A[2]+A[3]+A[4]+A[5]=0
6也是一个平衡指数,因为:
A[0]+A[1]+A[2]=A[4]+A[5]+A[6]
A[0]+A[1]+A[2]+A[3]+A[4]+A[5]=0
(零元素之和为零)7不是平衡指数,因为它不是序列a的有效指数。
如果你还有疑问,这是一个精确的定义:整数k是序列的平衡指数当且仅当且仅当和
假设零元素之和等于零。写一个函数
int equi(int[] A);
给定一个序列,返回其平衡指数(any),如果不存在平衡指数,则返回-1。假设序列可能很长
A中所有元素的总和
i
,计算从A[0]
到A[i-1]
的元素总和,直到总和等于(totalSum-A[i])/2
请注意,从
A[0]
到A[i-1]
的元素之和可以作为运行总数进行跟踪,这意味着整个算法的复杂性为O(n)。作为代码实现留给读者作为练习。这里有一个使用O(n)
内存的解决方案。计算S[i]=A[0]+A[1]+…+A[i]
。然后子序列[i,j]
的和是和(i,j)=S[j]-S[i-1]
(S[x<0]=0
)
因此,对于从0
到A.Length-1的每个i
检查Sum(0,i-1)=Sum(i+1,A.Length-1)
事实上,如果允许您销毁给定的数组,您甚至不需要S
,您可以在A
伪代码中完成这一切-最坏的情况是通过A进行2次
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
a=(-7,1,5,2,-4,3,0)
sumleet=0
sumright=0
对于范围内的i(len(a)):
这可能会在任意序列上失败,因为平衡指数并不总是包含序列的所有元素。在序列{1,2,3,4,5,10}中,根据给定的定义,4将是一个平衡指数,但是元素0-3的和是10,这小于元素的和除以2。事实上,没有元素的子集和这个值相加,但是有一个平衡指数。是的,所以要修正答案,如果我们发现部分和大于整个和的一半,返回-1代码>@Harper,我没有看到“均衡指数”的定义排除了该指数的值。我已经更新了我的答案。看来我明白了。有道理,并且通过了我能看到的测试。保持它为O(n)只会使它更好。对于那些试图阅读它的人来说,顺序是{-7,1,5,2-4,3,0}