leetcode 462

该博客讨论了如何在排序数组后,选择中间数作为基准,计算所有元素与中间数差的绝对值之和,证明了无论数组长度为奇数还是偶数,选取中间数的方式不影响结果。给出的解决方案是通过排序数组并计算平均差值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这题是先排序,然后让所有的数变成中间的那个数,所以计算所有数和中间数的差的绝对值就行了。有一个小细节,数组长度为奇数时,中间就一个数,没有争议;数组长度为偶数时,选取中间两个数中的任意一个,结果都是一样的。简单证明一下,设原数组长度为2n,也就是令数组为[A0,A1,A2....A2n-1],中间两个数分别为An-1和An。如果选取An-1作为中间的数,那么数组剩下n-1个数和它的差的绝对值的和sum=(An-1 - A0) + (An-1 - A1) + ... + (An-1 - An-1) + (An - An-1) + (An+1 - An-1) + ... +(A2n-1 - An-1) = (n-1)An-1 - (A0+A1+..+An-2) +  (An + An+1 +...+ A2n-1) - nAn-1 = (An + An+1 +... + A2n-1) - (A0 + A1 + ... + An-1)。如果选取An作为中间的数,数组剩下所有数和它的差的绝对值和sum=(An - A0) + (An - A1) + ... + (An - An-1) + (An+1 - An) + (An+2 - An) + (A2n-1 - An) = nAn - (A0 + A1 + ... + An-1) + (An+1 + An+2 + ... + A2n-1) - (n-1)An = (An + An+1 + ... + A2n-1) - (A0 + A1 + ... + An-1)。因此两种情况得到的结果相等。

class Solution {
    public int minMoves2(int[] nums) {
        Arrays.sort(nums);
        int mid = nums[nums.length / 2];
        int ans = 0;
        for(int n: nums){
            ans += Math.abs(n - mid);
        }
        return ans;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值