解法一

设这462. 最少移动次数使数组元素相等 II - 图1个数为非递减数列462. 最少移动次数使数组元素相等 II - 图2,最终相等时均为462. 最少移动次数使数组元素相等 II - 图3,那么最少移动次数462. 最少移动次数使数组元素相等 II - 图4满足:
462. 最少移动次数使数组元素相等 II - 图5
其实就是中学数学中一个非常常见的问题,求多个绝对值式子的最小和。
462. 最少移动次数使数组元素相等 II - 图6的简单情况为例,显然当取得最小值时,需要满足462. 最少移动次数使数组元素相等 II - 图7, 此时462. 最少移动次数使数组元素相等 II - 图8

回到原始问题,

  • 462. 最少移动次数使数组元素相等 II - 图9为偶数时,

462. 最少移动次数使数组元素相等 II - 图10
当满足462. 最少移动次数使数组元素相等 II - 图11时,每个二阶子问题的最小值可以同时达到。

  • 462. 最少移动次数使数组元素相等 II - 图12为奇数时,

462. 最少移动次数使数组元素相等 II - 图13
当满足462. 最少移动次数使数组元素相等 II - 图14时,每个二阶子问题和462. 最少移动次数使数组元素相等 II - 图15的最小值可以同时达到。

总的来说,将数列462. 最少移动次数使数组元素相等 II - 图16的中位数作为462. 最少移动次数使数组元素相等 II - 图17,就可以得到462. 最少移动次数使数组元素相等 II - 图18的最小值。

  1. class Solution {
  2. public int minMoves2(int[] nums) {
  3. int average = 0;
  4. Arrays.sort(nums);
  5. int ans = 0;
  6. for (int i = 0, j = nums.length - 1; i < j; ++i, --j) {
  7. ans += nums[j] - nums[i];
  8. }
  9. return ans;
  10. }
  11. }