LeetCode 453. Minimum Moves to Equal Array Elements 题解(C++)
题目描述
- 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.
举例
Input:
[1,2,3]Output:
3Explanation:
Only three moves are needed (remember each move increments two elements):[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]
思路
- 如果按照每次选取最小的n-1个数加1直到符合条件,则运行会超时,这里应该用数学技巧来做;
- 首先,在n个数中,选取n-1个最小的数加1,相当于n个数都加1之后最大的数减1,而n个数都加1对所有数之间的差距是不会改变的,这里我们忽略掉,每次选取n-1个数加1这个条件可以当成是最大的数减1,若要所有的数都相等,则需要找到n个数里最小的数minNum,并把剩余的每个数都减去minNum,则得到的就是移动的次数;
- 代码中,首先先遍历数组找出最小的数minNum,之后再遍历数组,将每个数都减去minNum,并把结果累加放在result中,result就是返回的结果。
代码
我的代码
class Solution
{
public:
int minMoves(vector<int>& nums)
{
int minNum = nums[0];
for (int i = 1; i < nums.size(); ++i)
{
minNum = min(minNum, nums[i]);
}
int result = 0;
for (auto num : nums)
{
result += num - minNum;
}
return result;
}
};