【Leetcode】517. Super Washing Machines 517. 超级洗衣机

1
2

解法

首先,很容易想到最终状态是什么样子的,假设最终每个洗衣机里都有target件衣服
其次,要理解所谓的一步是什么意思,其实题解给的很形象了,每一步,就是在两个节点之间画一个箭头,同一个节点不可以伸出两个箭头【但是一个节点可以接收2个箭头】,比如
1 <-- 4 <-- 5 61 <-- 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],可以看出,负的表示需要接收衣服,正的表示,需要送出衣服。

  1. 对于初始差数组里的正元素,因为要送出衣服,所以它们都肯定都是箭头的起点,而这些节点每一步只能伸出一个箭头,所以值为x的元素至少需要x步。所以ans的初始值就是差数组里的最大值,这里为ans=4
  2. 对于第一个洗衣机,它差1件衣服,必须从第二个洗衣机里得到,所以第一个间隔(0,1)里将会有1个箭头,然后数组变成了[0,-3,3,-2,4,-2],表示第二个洗衣机需要从第三个洗衣机处接收3件衣服,第二个间隔(1,2)处有3个箭头。
  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个箭头
    
  4. 最后的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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值