首页 > 编程语言 >算法: 超级洗衣机

算法: 超级洗衣机

时间:2022-08-15 22:15:25浏览次数:52  
标签:int 超级 洗衣机 算法 num ans sum machines

问题

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

标签:int,超级,洗衣机,算法,num,ans,sum,machines
From: https://www.cnblogs.com/zhangsanM/p/16589817.html

相关文章

  • 十大排序算法之【堆排序】
    堆排序代码://头文件省略voidheapify(vector<int>&in,intbottom,inttop){intlargest=top;intlson=top*2+1;intrson=top*2+1;if(lson......
  • 经典算法之快排
    快排的复杂度快排逻辑快速排序算法通过多次比较和交换来实现排序,其排序流程如下:首先设定一个分界值(基准值),通过该分界值将数组分成左右两部分。将大于或等于分界值......
  • SHA256加密算法
    https://www.cnblogs.com/zhangwuxuan/p/12863273.html算法介绍:比特币挖矿的御用算法SHA256是SHA-2下细分出的一种算法SHA-2,名称来自于安全散列算法2(英语:SecureHashA......
  • 一文带你弄懂 JVM 三色标记算法!
    大家好,我是树哥。最近和一个朋友聊天,他问了我JVM的三色标记算法。我脑袋一愣发现竟然完全不知道!于是我带着疑问去网上看了几天的资料,终于搞清楚啥事三色标记算法,它是用......
  • C++ 特殊矩阵的压缩存储算法
    1.前言什么是特殊矩阵?C++,一般使用二维数组存储矩阵数据。在实际存储时,会发现矩阵中有许多值相同的数据或有许多零数据,且分布呈现出一定的规律,称这类型的矩阵为特殊矩阵......
  • 算法学习之路 离散化
    //离散化值得就是一一对应的关系,通常处理大数据范围中的小范围数据;离散化的中的两个步骤:1.a[]中可能的重复元素(去重)2.如何算出x离散化之后的值(二分)/*离散化模板......
  • (未完)【算法学习笔记】04 最近公共祖先LCA
    【算法学习笔记】04最近公共祖先LCA原理顾名思义,就是求两点的最近公共祖先(自己也是自己的祖先)。也就是两点在走到根节点的路径上最先遇到的共同的点。向上标记法比较......
  • 详解二分查找算法 && leetcode35. 搜索插入位置
    https://blog.csdn.net/weixin_39126199/article/details/118785065 https://leetcode.cn/problems/search-insert-position/classSolution{public:intsearc......
  • ISP开源算法
      awesome-ISP https://github.com/starkfan007/awesome-ISP ExamplesopenISP--OpenImageSignalProcessor [code]fast-openISP--FastOpenImageSigna......
  • P1190 [NOIP2010 普及组] 接水问题(嵌套循环——贪心算法)
    学校里有一个水房,水房里一共装有mm个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为11。现在有nn名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺......