这题是先排序,然后让所有的数变成中间的那个数,所以计算所有数和中间数的差的绝对值就行了。有一个小细节,数组长度为奇数时,中间就一个数,没有争议;数组长度为偶数时,选取中间两个数中的任意一个,结果都是一样的。简单证明一下,设原数组长度为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;
}
}