前言
这几天忙着活动的事,我懒惰了学习,但是我不能一致懒下去鸭,好吧,前两日的题我做不出来,昨天也看到了12点20左右,实在是我爱莫能助,所以没有更新,今日的打卡,他来了。首先感谢大佬提醒我继续Fighting打卡,来啦来啦。老规矩,打卡界面。
大佬留言截图
小提示一句:我是从去年3月份左右开始关注大佬的,大佬的python相关讲解真的超级好,神经网络,Cnn算法这一类数据分析都又自己独特的见解,大家要是感兴趣可以关注一波鸭!(不是打广告,就是单纯小小崇拜。哈哈哈)
原题题目
假设有 n 台超级洗衣机放在同一排上。开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。
在每一步操作中,你可以选择任意 m (1 <= m <= n) 台洗衣机,与此同时将每台洗衣机的一件衣服送到相邻的一台洗衣机。
给定一个整数数组 machines 代表从左至右每台洗衣机中的衣物数量,请给出能让所有洗衣机中剩下的衣物的数量相等的最少的操作步数 。如果不能使每台洗衣机中衣物的数量相等,则返回 -1 。
原题案例
题目分析
在今天看到大佬的留言第一时间我就看了看了一眼我的LeetCode题,看了一眼,今天的超级洗衣机,感觉大致一看,可以搞,就赶紧回复了,现在他来啦。我对于这道题的思路是这样的,既然,题目说了,不能平均分就返回-1,那就先来一个衣服总数对洗衣机总数取余,不等于0,就是不能平均分配了鸭。在看之后的衣服怎么分,我的思路是这样的,就是我们从第一个开始拿,假如说他小于平均数,我们就从第二个洗衣机给他拿,第二个洗衣机也比他少,也从第三个洗衣机给他拿,第三个洗衣机拿完还有多的,就把多的拿出来,拿给第四个洗衣机。给大家举个例子叭,假如说我有4个洗衣机,分别装有[1,2,11,2]件衣服,总数16件,他们平均值为4件,那么他们每个洗衣机里面需要拿出的衣服就是[-3,-2,7,-2],那么我们就是第一个洗衣机差3件,从第二个洗衣机里拿,此时的结果就变成了,耗费了3次,[0,-5,7,-2],此时的2号洗衣机需要5件衣服,我们就从三号洗衣机拿,耗费了5次,此时结构就变成了[0,0,2,-2],最后到3号洗衣机里面有两件,正好给4号洗衣机了,再增加2次,最后结果就变成了3+5+2=10次。可能有的同学们不能理解的是,我二号洗衣机都没有那么多衣服,我怎么拿的呢,请注意题目中有一个叫做任意洗衣机取值,我们就假设知道该怎么放,就是不做重复的事。就是一种理想中的拿法。这就是我们的最优解。
代码实现
public int findMinMoves(int[] machines) {
//首先我们又必须要长度相等,所以可以先计算所有的和
int all = 0;
for(int i : machines){
all+=i;
}
int n = machines.length;
if(all% n!=0){
return -1;
}
int avg = all/n;
int sum=0,abs=0;
for (int i : machines) {
//统计需要的次数
sum+= i-avg;
//sum可能是负数,加一个abs,就让它取绝对值,
//对于它于i-avg取最大值就是我们有可能这一次的衣服并不是刚好都是从旁边拿的,
//因为旁边可能没有,就需要从更远的地方运过来,
//最后abs在进行一下比较的主要目的是为了更新数据,
//也是为了防止数据减少
abs = Math.max(abs,Math.max(Math.abs(sum),i-avg));
}
return abs;
}
leetCode运行截图
番外:
今天对我而言,还算是比较高兴的一天,我珍藏许久的MarkDown编辑器的使用方法纵欲分享出去了,今天的活动我个人觉得自己表现也还不错,最重要的时,哈哈哈,大佬给我评论留言啦 。冲冲冲!持续更新。
ps:每日一句毒鸡汤:累死你的不是工作,而是工作中遇到的人!