题目:
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]
思路:
每次增加除某一个数a之外的所有数,等价与每次减小a最终使得所有数相等.而第二种方法比较容易做到,所以就相当于每次把最大的数减1直到所有数和最小的数相等。下面给出了两个实现版本,其本质都是一样的。
代码:
版本1:
class Solution {
public:
int minMoves(vector<int>& nums) {
int min_value = *min_element(nums.begin(), nums.end());
int ret = 0;
for (auto val: nums) {
ret += val - min_value;
}
return ret;
}
};
版本2:
class Solution {
public:
int minMoves(vector<int>& nums) {
int sum = accumulate(nums.begin(), nums.end(), 0);
int min_value = *min_element(nums.begin(), nums.end());
return sum - nums.size() * min_value;
}
};