1. 题目
给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数。每次移动可以使 n - 1 个元素增加 1。
示例:
输入:
[1,2,3]输出:
3
解释:
只需要3次移动(注意每次移动会增加两个元素的值):[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-moves-to-equal-array-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 数学推导
- 设数组最小的数
MinNum
,数组和为sum
,元素个数n
,最终都是final
- 则最小的数肯定要变成
final
,每次都对最小的数+1是最少的次数(final-MinNum
) - 则 sum+(final−MinNum)∗(n−1)=final∗nsum+(final-MinNum)*(n-1) = final*nsum+(final−MinNum)∗(n−1)=final∗n
- sum−MinNum∗(n−1)=finalsum-MinNum*(n-1) = finalsum−MinNum∗(n−1)=final
- answer=final−MinNum=sum−MinNum∗nanswer = final-MinNum = sum-MinNum*nanswer=final−MinNum=sum−MinNum∗n
- 答案就是 sum−MinNum∗nsum-MinNum*nsum−MinNum∗n
class Solution {
public:int minMoves(vector<int>& nums) {long MinNum = nums[0], sum = nums[0]; int i, n = nums.size();for(i = 1; i < n; ++i){if(nums[i] < MinNum)MinNum = nums[i];sum += nums[i];}//(final-MinNum)*(n-1)+sum == n*final//final = sum-(n-1)*MinNum//final-MinNum = sum-n*MinNumreturn sum-n*MinNum;}
};