LeetCode517. 超级洗衣机

本文介绍了一个算法问题,即如何通过最少的操作步骤使一排洗衣机中的衣物数量相等。该问题探讨了在给定洗衣机初始衣物分布的情况下,如何计算达到均衡状态所需的最少步骤,并提供了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目


假设有 台超级洗衣机放在同一排上。开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。

每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机,与此同时将每台洗衣机的一件衣服送到相邻的一台洗衣机。

给定一个非负整数数组代表从左至右每台洗衣机中的衣物数量,请给出能让所有洗衣机中剩下的衣物的数量相等的最少的操作步数。如果不能使每台洗衣机中衣物的数量相等,则返回 -1。

 

示例 1:

输入: [1,0,5]

输出: 3

解释: 
第一步:    1     0 <-- 5    =>    1     1     4
第二步:    1 <-- 1 <-- 4    =>    2     1     3    
第三步:    2     1 <-- 3    =>    2     2     2   

示例 2:

输入: [0,3,0]

输出: 2

解释: 
第一步:    0 <-- 3     0    =>    1     2     0    
第二步:    1     2 --> 0    =>    1     1     1     

示例 3:

输入: [0,2,0]

输出: -1

解释: 
不可能让所有三个洗衣机同时剩下相同数量的衣物。

 

提示:

  1. n 的范围是 [1, 10000]。
  2. 在每台超级洗衣机中,衣物数量的范围是 [0, 1e5]。

 分析

判断能不能使得每台洗衣机里的衣服数量相等,当所有洗衣机里的衣服数量总和对洗衣机数量取余的不等于0的时候,则不能返回-1.

衣物总数除以洗衣机数量得到的就是平均每台洗衣机里最后应该有的衣服数量。lc表示当前洗衣机从左边所有洗衣机获取的数量,rc表示当前洗衣机从右边所以洗衣机获取的衣物数量。

遍历数组判断哪个洗衣机所运送的衣服次数最多,也就是最小的运送次数。

代码

class Solution {
    public int findMinMoves(int[] machines) {
        int sum = clothesSum(machines);
        if(sum == 0) return 0;
        if (sum%machines.length != 0) return -1;
        int avg = sum / machines.length;

        int tempSum = 0;
        int re = 0;
        for (int i = 0; i < machines.length; i++) {
            int lc = tempSum - i*avg;
            tempSum += machines[i];
            int rc = (sum - tempSum) - avg*(machines.length-1-i) ;
            if (rc > 0 && lc > 0){
                re = Math.max(re,Math.max(rc,lc));
            }else if (rc < 0 && lc < 0){
                re = Math.max(re, 0 - rc - lc) ;
            }else{
                re = Math.max(re,Math.max(Math.abs(lc),Math.abs(rc)));
            }
        }

        return re;
    }
    
    public static int clothesSum(int[] machines){
        int sum = 0;
        for (int i = 0; i < machines.length; i++) sum+= machines[i];
        return sum;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值