題目來源
每次把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;
}
};