解法
首先,很容易想到最终状态是什么样子的,假设最终每个洗衣机里都有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