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

Posted 是七喜呀!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:163.超级洗衣机相关的知识,希望对你有一定的参考价值。

超级洗衣机


题目链接: 超级洗衣机

有关题目

假设有 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;
    }
};

以上是关于《LeetCode之每日一题》:163.超级洗衣机的主要内容,如果未能解决你的问题,请参考以下文章

《LeetCode之每日一题》:245.超级次方

解题报告Leecode 372. 超级次方——Leecode每日一题系列

解题报告Leecode 372. 超级次方——Leecode每日一题系列

《LeetCode之每日一题》:280.矩阵置零

《LeetCode之每日一题》:127.删除注释

《LeetCode之每日一题》:264.递增的三元子序列