https://leetcode.com/problems/minimum-moves-to-equal-array-elements-ii/?tab=Description
数组每个元素可以加一减一,问需要多少步操作所有元素均相等
找中位数,两头往中位数靠拢.
也可以快排之后,两头往中间靠拢res += nums[j--] - nums[i++]
public class Solution { public int minMoves2(int[] nums) { int mid = findMid(nums); int res = 0; for (int num : nums) { res += Math.abs(num - mid); } return res; } private int findMid(int[] nums) { return findKth(nums, 0, nums.length - 1, (nums.length - 1) / 2); } private int findKth(int[] nums, int beg, int end, int k) { if (beg >= end) { return nums[beg]; } int mid = partition(nums, beg, end); if (mid == k) { return nums[mid]; } else if (mid > k) { return findKth(nums, beg, mid - 1, k); } else { return findKth(nums, mid + 1, end, k); } } private int partition(int[] nums, int beg, int end) { if (beg >= end) { return beg; } int temp = nums[beg]; while (beg < end) { while (beg < end && nums[end] >= temp) { end--; } nums[beg] = nums[end]; while (beg < end && nums[beg] < temp) { beg++; } nums[end] = nums[beg]; } nums[beg] = temp; return beg; } }