Given a non-empty integer array of size n, find the minimum number of moves required to make all array elements equal, where a move is incrementing n – 1 elements by 1.
Example:
Input:
[1,2,3]
Output:
3
Explanation:
Only three moves are needed (remember each move increments two elements):
[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]
class Solution {
public:
int minMoves(vector<int>& nums) {
int minval=*min_element(nums.begin(),nums.end());
int sum=accumulate(nums.begin(),nums.end(),0);
return sum-nums.size()*minval;
//分析如下:
首先题目的意思是每次move,相当于选nums里nums.size()-1个数加1,然后不停的执行move,直到nums里的数都相等;
先来分析一下,不管每次怎么move,被选中要加一的数里一定含有最小的那个数,如若不然,就是加1的数里没有最小的那个,其他的数本来就比它大了,加1后就更 大了,要求是最少的move次数,所以必须每次move中要加1的数里含有最小的那个数。
设最后每个数都是m。 一开始nums中最小的数是minval, nums的和是sum。cnt是move的次数
每次move,相当于sum加nums.size()-1。
于是最后根据每个数相等 有方程:
nums.size()*m=sum+cnt*(nums.size()-1),
又每次move加1里都有minval,所以move的次数cnt=m-minval.
可以解出 cnt=sum-nums.size()*minval;
}
};