题目
给你一个长度为 n 的整数数组 nums ,返回使所有数组元素相等需要的最少移动数。
在一步操作中,你可以使数组中的一个元素加 1 或者减 1 。
示例 1:
输入:nums = [1,2,3]
输出:2
解释:
只需要两步操作(每步操作指南使一个元素加 1 或减 1):
[1,2,3] => [2,2,3] => [2,2,2]
示例 2:
输入:nums = [1,10,2,9]
输出:16
提示:
n == nums.length
1 <= nums.length <= 105
-109 <= nums[i] <= 109
代码
package dayLeetCode;
import java.util.Arrays;
public class dayleetcode462 {
// 中位数,数学题,可以用数学证明为什么中位数得到的结果最小
// 我们将其排序之后,分别首尾形成一个集合,我们发现当要成为的数在每个集合中时,才能保证和最小
public int minMoves2(int[] nums) {
Arrays.sort(nums);
int mid = nums[nums.length / 2];
int ans = 0;
for (int num : nums){
ans += Math.abs(num - mid);
}
return ans;
}
public static void main(String[] args) {
dayleetcode462 obj = new dayleetcode462();
System.out.println(obj.minMoves2(new int[]{1, 2, 3}));
}
}
本文介绍了一种解决LeetCode 462题目的方法,通过计算数组排序后的中位数,确定每次操作使得所有元素趋近于这个中位数所需的最少移动次数。通过实例演示和代码实现,展示了如何利用数学原理优化问题求解。
196

被折叠的 条评论
为什么被折叠?



