Minimum Moves to Equal Array Elements

题目来源
每次把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& nums) {
        auto n = nums.size();
        if (n == 1)
            return 0;
        int minNum = nums[0];
        long long sum = nums[0];
        for (int i=1; i

你可能感兴趣的:(Minimum Moves to Equal Array Elements)