最小操作次数使数组元素相等

思路和算法

因为只需要找出让数组所有元素相等的最小操作次数,所以我们不需要考虑数组中各个元素的绝对大小,即不需要真正算出数组中所有元素相等时的元素值,只需要考虑数组中元素相对大小的变化即可。

因此,每次操作既可以理解为使 n-1 个元素增加 1,也可以理解使 1 个元素减少 1。显然,后者更利于我们的计算。

于是,要计算让数组中所有元素相等的操作数,我们只需要计算将数组中所有元素都减少到数组中元素最小值所需的操作数,即计算

i=0n1nums[i]min(nums)ni\sum_{i=0}^{n-1} \textit{nums}[i] - min(\textit{nums}) * ni

在实现中,为避免溢出,我们可以逐个累加每个元素与数组中元素最小值的差,即计算

i=0n1(nums[i]min(nums))\sum_{i=0}^{n-1} (\textit{nums}[i] - \textit{min}(\textit{nums}))

代码 :

class Solution {
public:
    int minMoves(vector<int>& nums) {
        int mi=*min_element(nums.begin(),nums.end()),ans=0;
        for(auto t:nums){
            ans+=t-mi;
        }
        return ans;
    }
};