给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数。每次移动可以使 n - 1 个元素增加 1
。
示例:
输入:[1,2,3]
输出:3
解释:只需要3次移动(注意每次移动会增加两个元素的值):
[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]
自己的思考:
一、
刚开始哈,我也没管太多(增加1)。
思路是这样的
先排序、找到最小值、让剩下的数都减去最小值
继续排序、重复
直到 最小值-最大值==0结束
。。。。完了之后吧、我的错误代码陷入了死循环
二、
先不管最后的结果是哪个数
先排序
比如数组[1,3,5]
找到最大的数、这里为5
要想让剩下的数都变成一样的
那么对于3来说,它需要加2次1
对于1来说,需要加4次1
所以等到最后都变成5时
一共加了2+4次
也就可以推出:移动次数=(最大值-剩下值们)的和
function FindMinMoves(arr) {
arr.sort();
var sum=0;
for(var j=0;j<arr.length-1;j++){
sum=sum+arr[arr.length-1]-arr[j];
}
return sum;
}
还有一种解法、一个公式
移动次数=和-最小值*长度
我刚开始其实哈没明白这公式为啥这样写
可能是数学没学好
完了就自己分析、推呗
数组[1,3,5]
按照公式来算
MOVES=(1+3+5)-1*3=6
(最小值*长度) =》假如数组中的值都为最小值、和的结果是多少
(和-最小值 长度) =》差就是剩下的数和最小值差的和
代码
function FindMinMoves(arr){
var Sum=0;
for(var t=0;t<arr.length;t++){
Sum+=arr[t];
}
return Sum-arr[0]*arr.length;
}