在Python中移动以使数组中的所有元素相等



我遇到了一个输入如下的问题:

5
1 1 1 1 6

预期输出为4

基本上,我们要做的是打印使所有5个值相等所需的最小移动次数。一次移动意味着减少一个位置并增加另一个位置。如果不能使它们都相等,我们打印-1。

我尝试了以下方法:

def solution(N, W):
counter=0
W.sort()
k=W[int(N/2)]
for i in range(0,N):
counter=counter+abs(W[i]-k)

if N%2==0:
tempC=0
k=W[int(N/2)-1]

for i in range(0,N):
tempC=tempC+abs(A[i]-k)

counter=min(counter,tempC)

return counter

答案是5。请分享您实现这一目标的功能。

让我们看看逻辑如何与您的输入一起工作。

5 1 1 1 1 6

1。如果1 2 1 3 3这种情况可能,那么它最终显示为类似于2 2 2 2 2。我们从这个结果Sum(INITAL_LIST) is equal to SUM(FINAL_LIST)得到了什么,这是1st condition,如果这个保持模式是可能的。

2.在所有的index-value中,有些会留下一些值,有些会拿走。one-index的递减和another-index的递增是一个步骤,所以我们只考虑递减的情况。那些正在离开并最终成为平等的2。所以total-step等于一些递减的索引值。

为了便于操作,这里我使用了numpy的矢量化特性。

代码:

import numpy as np
def solution(N, W):
if sum(W)%N !=0:
return -1

eq = sum(W)//N
step = np.array(W)-eq
step_sum = np.sum(step[step>0])
return step_sum

if __name__ == '__main__':
var_, list_ = input().split(maxsplit=1)
print(solution(int(var_), list(int(i) for i in list_.split())))

无数字:

更新:

step = np.array(W)-eq
step_sum = np.sum(step[step>0])

收件人:

step = [i-eq for i in W]
step_sum = sum(i for i in step if i>0)

输出:

5 1 1 1 1 6
4

最新更新