​LeetCode刷题实战517:超级洗衣机

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 超级洗衣机,我们先来看题面:

https://leetcode-cn.com/problems/super-washing-machines/

You have n super washing machines on a line. Initially, each washing machine has some dresses or is empty.

For each move, you could choose any m (1 <= m <= n) washing machines, and pass one dress of each washing machine to one of its adjacent washing machines at the same time.

Given an integer array machines representing the number of dresses in each washing machine from left to right on the line, return the minimum number of moves to make all the washing machines have the same number of dresses. If it is not possible to do it, return -1.

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

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

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

示例                         

cdcaafb648aba8c52fad25cae933b19c.png

解题

https://www.cnblogs.com/ambition-hhn/p/12877423.html

这道题给出了初始每个洗衣机内的衣服,每一次操作可将任意个洗衣机内的一件衣服移到相邻的一台洗衣机内,问每台洗衣机内的衣服经过多次操作后是否可以相等,如果可以,那么最少操作步骤是多少。这道题用的方法很巧妙,时间复杂度只需要O(n),具体方法是首先计算出是否可以给每台洗衣机分配相等的衣服,如果可以就继续计算出每台洗衣机最终的衣服数量P,然后用当前数组减去P得出每台洗衣机需要的衣服或者多余的衣服,并且统计出多余衣服的最大值ans1(这里只统计多余的是因为一个洗衣机每次最多只能给出一件衣服,但是最多可以接收两件衣服,所以接收衣服的次数无法准确得出)。

然后从第一个洗衣机开始计算当前需要还是多余的衣服数,然后计算第二个,因为这里无论第一个洗衣机多余衣服还是需要衣服都需要经过第二个洗衣机,第三个洗衣机相对于第二个也是同理,把数组种第一个的值加在第二个上面就是第二个洗衣机需要或者多余的衣服数,统计每次处理后数组绝对值的最大值ans2,最终答案就是ans1和ans2中的最大值。

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

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-500题汇总,希望对你有点帮助!

LeetCode刷题实战501:二叉搜索树中的众数

LeetCode刷题实战502:IPO

LeetCode刷题实战503:下一个更大元素 II

LeetCode刷题实战504:七进制数

LeetCode刷题实战505:迷宫II

LeetCode刷题实战506:相对名次

LeetCode刷题实战507:完美数

LeetCode刷题实战508:出现次数最多的子树元素和

LeetCode刷题实战509:斐波那契数

LeetCode刷题实战510:二叉搜索树中的中序后继 II

LeetCode刷题实战511:游戏玩法分析 I

LeetCode刷题实战512:游戏玩法分析 II

LeetCode刷题实战513:找树左下角的值

LeetCode刷题实战514:自由之路

c28a5dfd74d6f449386f2ef7f89f1123.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值