如果我们可以将特定数组元件增加/减少1,则最小总移动到平衡阵列

minimum total move to balance array if we can increase/decrease a specific array element by 1

本文关键字:阵列 平衡 移动 减少 我们 增加 数组 如果      更新时间:2023-10-16

它是leetcode 462。我有一种算法,但是在通过其他算法时,它未能进行一些测试。我试图思考,但不确定我忽略了什么角色。

我们有一个n个元素。一个动作被定义为1个数组的一个元素增加或减少1个。

我的想法是:1.找到平均2.找到最接近平均值的元素3.将每个元素与最接近平均值的元素之间的差异总结。我想念什么?请提供一个反示例。

class Solution {
public:
    int minMoves2(vector<int>& nums) {
        int sum=0;
        for(int i=0;i<nums.size();i++){
            sum += nums[i];
        }
        double avg = (double) sum / nums.size();
        int min = nums[0];
        int index =0 ;
        for(int i=0;i<nums.size();i++){
            if(abs(nums[i]-avg) <= abs(min - avg)){
                min = nums[i];
                index = i;
            }
        }
        sum=0;
        for(int i=0;i<nums.size();i++){
            sum += abs(min - nums[i]);
        }
        return sum;
    }
};

假设数组为[1、1、10、20、100]。平均值有点超过20。因此,您的解决方案将涉及19 19 10 10 0 80移动=128。如果我们定位10,该怎么办?然后,我们有9 9 0 10 90移动= 118。

假设您决定针对将所有数组元素更改为某个值T的目标。问题是,t的正确值是什么?鉴于t的一定价值,我们可以询问增加或减少t是否会改善或恶化我们的结果。如果我们将t降低1,那么所有值大于t都需要额外的移动,而下面的所有值都需要少移动。这意味着,如果t高于中位数,则比上面有更多的值,因此我们受益于降低T。如果T小于中位数,我们可以提出相反的论点。由此我们可以得出结论,T的正确值实际上是中位数本身,我的示例证明了这一点(严格来说,当您具有均匀尺寸的数组时,T可以在两个中间元素之间进行任何位置)。