算法: 超级洗衣机

问题

  • 假设有 n 台超级洗衣机放在同一排上。开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。
    在每一步操作中,你可以选择任意 m (1 <= m <= n) 台洗衣机,与此同时将每台洗衣机的一件衣服送到相邻的一台洗衣机。
    给定一个整数数组 machines 代表从左至右每台洗衣机中的衣物数量,请给出能让所有洗衣机中剩下的衣物的数量相等的 最少的操作步数 。
    如果不能使每台洗衣机中衣物的数量相等,则返回 -1 。

解决

//贪心:将每台机器的衣服转移当作i位置与左右两个部分来操作
//     左    i     右
// 第i个位置的时候至少需要调整ans步才能达到平衡
    //ans=|l|+|r|
    //ans=max(|l|,|r|)
class Solution {
    public int findMinMoves(int[] machines) {
        int couNum=0;                   //衣服数量
        int nums=machines.length;       //洗衣机数量
         for(int i=0;i<nums;i++){       //获得所有衣服数量
             couNum+=machines[i];
         }
         if(couNum%nums!=0){            //如果衣服总数不能被洗衣机数量除尽那么就返回-1
             return -1;
         }
         return reMinStep(machines,nums,couNum);
    }
    public int reMinStep(int[] arr,int len,int sum){
        int leftSum=0;              //i位置左边衣服数量
        int ans=0;                  //最大每个位置(i)需要移动的衣服数量
        int avg=sum/len;            //平均每个位置需要的衣服数量
        for(int i=0;i<len;i++){
            int cur=0;
            int leftRest=leftSum-i*avg;                      //左边需要的衣服(+拿出,-拿入)
            int rightRest=(sum-leftSum-arr[i])-(len-i-1)*avg;  //右边需要的衣服(+拿出,-拿入)
            if(leftRest<0&&rightRest<0){                     //如果左右两边都需要衣服
                cur=Math.abs(leftRest)+Math.abs(rightRest);
            }else{                                            //左右两边都多衣服、左边(右边)多衣服或者少衣服
                cur=Math.max(Math.abs(leftRest),Math.abs(rightRest));
            }
            leftSum+=arr[i];
            ans=Math.max(ans,cur);
        }
        return ans;
    }
}
//代码优化
class Solution {
    public int findMinMoves(int[] machines) {
        int tot = Arrays.stream(machines).sum();
        int n = machines.length;
        if (tot % n != 0) {
            return -1;
        }
        int avg = tot / n;
        int ans = 0, sum = 0;
        for (int num : machines) {
            num -= avg;
            sum += num;
            ans = Math.max(ans, Math.max(Math.abs(sum), num));
        }
        return ans;
    }
}
posted @   new_monkey  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示