Com*_*Man 10 arrays algorithm data-structures
如何将数组分成2个部分,使这两个部分具有相等的平均值?每个分区可能包含数组中不连续的元素.我能想到的唯一算法是指数可以做得更好吗?
Pen*_*One 17
您可以将此问题减少到sum-subset问题 - 此处也缓存.这是个主意.
让我们A
成阵.计算S = A[0] + ... + A[N-1]
,N
长度在哪里A
.对于k
从1
到N-1
,让T_k = S * k / N
.如果T_k
是整数,则找到总和A
的大小子集.如果你能做到这一点,那么你就完成了.如果您不能执行此操作,则不存在此类分区.k
T_k
k
这是这种方法背后的数学.假设存在一个分区,A
使得两个部分具有相同的平均值,X
大小x
和Y
大小y
就是分区,其中x+y = N
.那你必须有
sum(X)/x = sum(Y)/y = (sum(A)-sum(X)) / (N-x)
Run Code Online (Sandbox Code Playgroud)
所以有点代数给出了
sum(X) = sum(A) * x / N
Run Code Online (Sandbox Code Playgroud)
由于数组包含整数,因此左侧是整数,因此右侧也必须如此.这会激发T_k = S * k / N
必须是整数的约束.唯一剩下的部分是实现T_k
大小子集的总和k
.