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<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;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容