《LeetCode之每日一题》:163.超级洗衣机

这篇博客探讨了如何解决一个涉及洗衣机平衡衣物数量的数学问题。在每一步操作中,可以选择任意数量的洗衣机并将衣服传递给相邻的洗衣机。通过举例说明了如何在最少操作次数下达到所有洗衣机衣物数量相等,解释了贪心策略的应用,并提供了具体的代码实现。讨论了特定案例如4004和[0,0,11,5]的情况,展示了所需的步骤。
摘要由CSDN通过智能技术生成

超级洗衣机


题目链接: 超级洗衣机

有关题目

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

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

给定一个整数数组 machines 代表从左至右每台洗衣机中的衣物数量,
请给出能让所有洗衣机中剩下的衣物的数量相等的 最少的操作步数 。

如果不能使每台洗衣机中衣物的数量相等,则返回 -1

题解

Tips
参考官方题解评论区下排列评论

①理解题干中关键句:
Q1:在每一步操作中,你可以选择任意 m (1 <= m <= n) 台洗衣机,与此同时将每台
洗衣机的一件衣服送到相邻的一台洗衣机。

A1:即首先我们是可以 在一步操作中,注意是 一步操作中,将任意 m 台洗衣机相邻
洗衣机的一件衣服传到相邻的一台洗衣机中。 
例子:有洗衣机数组 machine = [ 7, 4, 2, 1],
在一次操作中 我们是可以将7 的一件衣服通过相邻的衣服送给 1 ,使 数组machine = [6, 4, 2, 2]。

Q2:为什么4 0 0 4 需要的操作数是2, 怎么实现的呢
A2:初始4 0 0 4 第一步选第一个和第四个洗衣机 3 1 1 3 
第二步选第一个和第四个 2 2 2 2 即每次可以选的洗衣机个数不止一个

Q2:为什么【0,0,11,5】的输入为什么不是7步,而是8步?
A3:1步:0     0 <-- 11    5,变成0     1     10     52步:0 <-- 1 <-- 10    5,变成1     1     9     53步:1 <-- 1 <-- 9     5,变成2     1     8     54步:2 <-- 1 <-- 8     5,变成3     1     7     55步:3 <-- 1 <-- 7     5,变成4     1     6     56步:4     1 <-- 6     5,变成4     2     5     57步:4     2 <-- 5     5,变成4     3     4     58步:4     3 <-- 4 <-- 5,变成4     4     4     4

法一:贪心
参考官方题解
在这里插入图片描述

class Solution {
public:
    int findMinMoves(vector<int>& machines) {
        int n = machines.size();

        //先判断洗衣机是否能够使 每台洗衣机中衣物的数量相等
        int tot = accumulate(machines.begin(), machines.end(), 0);
        if (tot % n != 0) return -1;

        int ans = 0;
        int avg = tot / n, sum = 0;
        for (auto num : machines){
            num -= avg;
            sum += num;
            ans = max(ans, max(abs(sum), num));
        }
        return ans;
    }
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值