2021.9.29打卡

517. 超级洗衣机
个人思路
官方题解:贪心

首先,计算洗衣机每个桶的平均值,如果无法求平均值返回-1。

然后,计算每个洗衣机与平均值的差值,为正表示需要移出,为负表示需要移入。

考虑前i个洗衣机差值之和,大于0表示前i个洗衣机需要向后面的洗衣机移出差值的衣服,小于0表示前i个洗衣机需要移入差值的衣服。

还要考虑前i个洗衣机内存在较大衣服的洗衣机,除了需要向后面洗衣机移出衣服,还要向前i个洗衣机内部移动衣服。

取两者最大值为答案

class Solution {
public:
    int findMinMoves(vector<int>& machines) {
        int sum=0;
        for(int num:machines)
            sum+=num;
        if(sum%machines.size())
            return -1;
        int r=sum/machines.size();
        sum=0;
        int ans=0;
        for(int num:machines){
            num-=r;
            sum+=num;
            ans=max(ans,max(abs(sum),num));
        }
        return ans;
    }
};

一些思考:

  • 为什么计算前i个洗衣机的差值和?首先题目要求洗衣机只能向向相邻洗衣机移动衣服,如果前i个洗衣机的差值和大于0,需要将多的衣服移到右侧,由于只能相邻移动,每次必须将衣服移到第i个洗衣机,然后第i个洗衣机再移到右侧,所以需要的操作数是前i个洗衣机的差值。
  • 为什么需要比较每个洗衣机的差值?如果洗衣机差值大于0,该洗衣机需要移出差值的衣物,在前i个洗衣机中如果某个洗衣机的衣物较多,除了移入右侧的洗衣机,还要平衡前i个洗衣机内部的衣物,所以操作数是该洗衣机的差值;而差值小于0的洗衣机无需考虑,因为该洗衣机可以接收多个洗衣机移入的衣物。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值