

解法
首先,很容易想到最终状态是什么样子的,假设最终每个洗衣机里都有target件衣服
其次,要理解所谓的一步是什么意思,其实题解给的很形象了,每一步,就是在两个节点之间画一个箭头,同一个节点不可以伸出两个箭头【但是一个节点可以接收2个箭头】,比如
1 <-- 4 <-- 5 6和1 <-- 4 5 --> 6都是合法的一步,但1 <-- 4 --> 5 6就不合法了。
以[1,0,5,0,6,0]为例,最后的状态是[2,2,2,2,2,2],假如我们作个差,得到:[-1,-2,3,-2,4,-2],可以看出,负的表示需要接收衣服,正的表示,需要送出衣服。
- 对于初始差数组里的正元素,因为要送出衣服,所以它们都肯定都是箭头的起点,而这些节点每一步只能伸出一个箭头,所以值为
x的元素至少需要x步。所以ans的初始值就是差数组里的最大值,这里为ans=4 - 对于第一个洗衣机,它差1件衣服,必须从第二个洗衣机里得到,所以第一个间隔
(0,1)里将会有1个箭头,然后数组变成了[0,-3,3,-2,4,-2],表示第二个洗衣机需要从第三个洗衣机处接收3件衣服,第二个间隔(1,2)处有3个箭头。 - 依此类推:
(2,3):[0,0,0,-2,4,-2],0个箭头 (3,4):[0,0,0,-2,4,-2],2个箭头 (4,5):[0,0,0,0,2,-2],2个箭头 - 最后的
ans就是初始值4和每个间隔的箭头数[1,3,0,2,2]中最大的那个值,所以答案为4。
class Solution(object):
def findMinMoves(self, machines):
"""
:type machines: List[int]
:rtype: int
"""
total = sum(machines)
n = len(machines)
if total%n!=0:
return -1
target = total/n
machines = map(lambda x:x-target,machines)
ans = max(machines)
for i in xrange(n-1):
ans = max(ans,abs(machines[i]))
machines[i+1] += machines[i]
return ans
本文详细解析了一种用于平衡分配洗衣机中衣物数量的算法。通过计算初始状态下各洗衣机衣物数量与目标平均值的差值,确定了每台洗衣机是需要接收还是送出衣物。算法的关键在于确定最小移动步骤,确保所有洗衣机最终达到目标衣物数量,同时考虑了算法的实现细节。
343

被折叠的 条评论
为什么被折叠?



