462. 最少移动次数使数组元素相等 II
给你一个长度为 n 的整数数组 nums ,返回使所有数组元素相等需要的最少移动数。
在一步 *** 作中,你可以使数组中的一个元素加 1 或者减 1 。
示例:
输入:nums = [1,2,3]
输出:2
解释:
只需要两步 *** 作(每步 *** 作指南使一个元素加 1 或减 1):
[1,2,3] => [2,2,3] => [2,2,2]
本题目主要利用中位数的性质
中位数是指有限有序序列
x
1
,
x
2
,
⋯
,
x
n
x_1,x_2,\cdots,x_n
x1,x2,⋯,xn中最中间的那个数,由中位数的性质可知对于一个有限数列
x
1
,
x
2
,
⋯
,
x
n
x_1,x_2,\cdots,x_n
x1,x2,⋯,xn(此时不一定是有序的),中位数
x
x
x使得
f
(
x
)
=
∣
x
−
x
1
∣
+
∣
x
−
x
2
∣
+
⋯
+
∣
x
−
x
n
∣
f(x)=|x-x_1|+|x-x_2|+\cdots+|x-x_n|
f(x)=∣x−x1∣+∣x−x2∣+⋯+∣x−xn∣取得最小值。(如果对证明感兴趣的朋友们可以看一下这篇文章)
因此我们这道题只需要找出中位数,计算每个元素与中位数的差值,并求和即可。
具体代码实现如下:
var minMoves2 = function(nums) {
//先排序,找中位数,这样 *** 作的次数最小
nums.sort((a, b) => a - b);
let x = Math.floor((nums.length) / 2);
let res = 0;
for(const i of nums){
res += Math.abs(i - nums[x]);
}
return res;
};
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)