class Solution {
public int findMinMoves(int[] machines) {
int sum = 0;
int avg = 0;
int n = machines.length;
for (int machine : machines) {
sum += machine;
}
if(sum%n !=0){
return -1;
}
avg = sum/n;
int[] help = new int[n];
int res = 0;
for (int i = 0; i < help.length; i++) {
help[i] = machines[i]-avg;
//这步不加abs,因为正数不可以同时分配给左右两侧,但是负数可以由左右两侧同时补充
//同时最初的数组也是需要维护max的
//因为当做差后出现左右两侧为负中间为正的时候,
//正数不可以同时分配给左右两侧,所以最大的次数是正数的值。
res = Math.max(res,help[i]);
}
for (int i = 0; i < help.length-1; i++) {
res = Math.max(res,Math.abs(help[i]));
help[i+1] = help[i]+help[i+1];
}
return res;
}
}
思路来源于力扣用户:tracywwp
解题思路: 有四个洗衣机,装的衣服数为[0, 0, 11, 5],最终的状态会变为[4, 4, 4, 4],那么我们将二者做差,得到*[-4, -4, 7, 1],这里负数表示当前洗衣机还需要的衣服数,正数表示当前洗衣机多余的衣服数。我们要做的是*要将这个差值数组每一项都变为0,对于第一个洗衣机来说,需要四件衣服可以从第二个洗衣机获得,那么就可以 把-4移给二号洗衣机,那么差值数组变为[0, -8, 7, 1],此时二号洗衣机需要八件衣服,那么至少需要移动8次。然后二号洗衣机把这八件衣服从三号洗衣机处获得,那么差值数组变为[0, 0, -1, 1],此时三号洗衣机还缺1件,就从四号洗衣机处获得,此时差值数组成功变为了[0, 0, 0, 0],成功。那么移动的最大次数就是差值 数组中出现的绝对值最大的数字,8次