给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数。每次移动可以使 n - 1 个元素增加 1。
示例:
输入: [1,2,3] 输出: 3 解释: 只需要3次移动(注意每次移动会增加两个元素的值): [1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]
思路:这是一道纯数学问题,假设数组总和为sum,最小值为min_number,那么满足如下等式:
sum+m*(n-1)=n*x //其中x为最终相等的值,n为数组的长度,m是移动的次数
由于观察到:x=min_number+m,这个等式的意思是:最终相等的值一定是由最小的数min_number+移动的次数m得到的。这里有反证法,先默认成立。
那么化简等式:m=sum-min_number*n
这里证明等式,假设不是由最小值加m次得到x的,假设是由另外一个值p加m次得到x的,那么对于最小值min_number来说,被加的次数一定小于x,所以条件不成立。一定是最小的那个值加了m次得到的x。
参考代码:
class Solution {
public:
int minMoves(vector<int>& nums) {
if (nums.size() <= 1) return 0;
int min_number = nums[0];
int sum = 0;
for (int i = 0; i < nums.size(); i++) {
sum += nums[i];
if (min_number > nums[i]) min_number = nums[i];
}
return sum - min_number * nums.size();
}
};