题目来源
每次把n-1个数都加1,看需要多少次这样的操作可以把所有的数都变成一样的,看了一会,我想着能不能先把所有的数都搞成最大值那么大,看看总的差值有多少,再往上算,使得差值是n-1的倍数。
然后发现不行…wrong answer!感觉想不出来了!
然后看了讨论区,发现就一个简单的数学问题啊!!!我实际上有想到解一下方程的,但是想想还是放弃了…
假设需要m次移动,然后最后每个数都是x。sum表示原来所有数的和。
那么有 sum + m * (n - 1) = x * n
,
并且x = minNum + m
,(这个是在每次加1操作都作用于最小值的前提下)
然后就可以得出sum - n * minNum = m
。
理解起来有点困难,为什么那个前提是成立的,因为这些加1操作都是可交换的,假如你有一次加1操作不作用于最小值上,那么就相当于第一次加1操作的时候你把所有除了最小值外的数加1,这显然是不好的选择。
代码如下:
class Solution {
public:
int minMoves(vector<int>& nums) {
auto n = nums.size();
if (n == 1)
return 0;
int minNum = nums[0];
long long sum = nums[0];
for (int i=1; i<n; i++) {
minNum = min(minNum, nums[i]);
sum += nums[i];
}
return sum - n * minNum;
}
};