453.Minimum Moves to Equal Array Elements

453.Minimum Moves to Equal Array Elements

难度:Easy

给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数。每次移动可以使 n - 1 个元素增加 1。

示例:

输入:
[1,2,3]

输出:
3

解释: 只需要3次移动(注意每次移动会增加两个元素的值):

[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]

直观方法是将数组排序,然后每次将前面n-1个元素加1,如果碰到倒数第二个值大于最后一个值,则交换两个数,直到第一个数和最后一个数相等。但是会显示超时。 另一个比较好的解决方法是从反面考虑,每次将n-1个元素加1,相当于将一个元素-1,之后整体相对大小关系不变。所以每个数减到和最小值相等即可。可以在线性时间内完成,时间复杂度是O(N)。

class Solution {
public:
    int minMoves(vector<int>& nums) {
        if(nums.size()==1) return 0;
        int res=0;
       int  minimum=*min_element(nums.begin(),nums.end());
        for(auto i: nums)
            res +=i-minimum;
        return res;
    }
};

执行用时 : 52 ms, 在Minimum Moves to Equal Array Elements的C++提交中击败了93.27% 的用户 内存消耗 : 10.8 MB, 在Minimum Moves to Equal Array Elements的C++提交中击败了85.59% 的用户

Last updated