题目
假设有 n 台超级洗衣机放在同一排上。开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。
在每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机,与此同时将每台洗衣机的一件衣服送到相邻的一台洗衣机。
给定一个非负整数数组代表从左至右每台洗衣机中的衣物数量,请给出能让所有洗衣机中剩下的衣物的数量相等的最少的操作步数。如果不能使每台洗衣机中衣物的数量相等,则返回 -1。
示例 1:
输入: [1,0,5] 输出: 3 解释: 第一步: 1 0 <-- 5 => 1 1 4 第二步: 1 <-- 1 <-- 4 => 2 1 3 第三步: 2 1 <-- 3 => 2 2 2示例 2:
输入: [0,3,0] 输出: 2 解释: 第一步: 0 <-- 3 0 => 1 2 0 第二步: 1 2 --> 0 => 1 1 1示例 3:
输入: [0,2,0] 输出: -1 解释: 不可能让所有三个洗衣机同时剩下相同数量的衣物。
提示:
- n 的范围是 [1, 10000]。
- 在每台超级洗衣机中,衣物数量的范围是 [0, 1e5]。
分析
判断能不能使得每台洗衣机里的衣服数量相等,当所有洗衣机里的衣服数量总和对洗衣机数量取余的不等于0的时候,则不能返回-1.
衣物总数除以洗衣机数量得到的就是平均每台洗衣机里最后应该有的衣服数量。lc表示当前洗衣机从左边所有洗衣机获取的数量,rc表示当前洗衣机从右边所以洗衣机获取的衣物数量。
遍历数组判断哪个洗衣机所运送的衣服次数最多,也就是最小的运送次数。
代码
class Solution {
public int findMinMoves(int[] machines) {
int sum = clothesSum(machines);
if(sum == 0) return 0;
if (sum%machines.length != 0) return -1;
int avg = sum / machines.length;
int tempSum = 0;
int re = 0;
for (int i = 0; i < machines.length; i++) {
int lc = tempSum - i*avg;
tempSum += machines[i];
int rc = (sum - tempSum) - avg*(machines.length-1-i) ;
if (rc > 0 && lc > 0){
re = Math.max(re,Math.max(rc,lc));
}else if (rc < 0 && lc < 0){
re = Math.max(re, 0 - rc - lc) ;
}else{
re = Math.max(re,Math.max(Math.abs(lc),Math.abs(rc)));
}
}
return re;
}
public static int clothesSum(int[] machines){
int sum = 0;
for (int i = 0; i < machines.length; i++) sum+= machines[i];
return sum;
}
}