题目来源:https://leetcode.cn/problems/minimum-moves-to-equal-array-elements-ii/
大致题意:
给一个数组,每次操作可以将一个数 +1 或者 -1,求将数组所有元素变相等的最少操作次数
思路
若想让数组元素都相等,那么需要将较小的数变大,较大的数变小,这就需要找一个合适的中间值让其他数增加或减少为该值
比较合适的选择即为数组的中位数,那么只要找到中位数就可以通过遍历数组,求出所有元素与中位数的绝对值的和,该和即为答案
找中位数的方法可以是排序后直接取中间值,也可以通过快速选择的方法在 O(n) 的时间复杂度内找到该数
这里我直接使用了排序后取中位数的方法
public int minMoves2(int[] nums) {
Arrays.sort(nums); // 排序
int n = nums.length;
int mid = n / 2;
int target = nums[mid]; // 取中位数
int ans = 0;
// 获取数组所有元素与中位数的差值和
for (int i = 0; i < n; i++) {
if (i < mid) {
ans += target - nums[i];
} else {
ans += nums[i] - target;
}
}
return ans;
}