LeetCode462: 最少移动次数使数组元素相等 II
最少移动次数使数组元素相等 II
给你一个长度为 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
解题思路
我们需要求出最小移动次数使得数组的元素相等,它是一个求中位数的问题,把原来的数组进行排序,然后求出中位数,遍历一次分别统计移动的次数就行。
Java代码
class Solution {
public int minMoves2(int[] nums) {
int result = 0;
int n = nums.length;
Arrays.sort(nums);
int mid = n / 2;
int min_number = 0;
if(n % 2 != 0){
min_number = nums[mid];
}else {
min_number = (nums[mid-1] + nums[mid] + 1) / 2;
}
for (int i = 0; i < n; i++) {
result += Math.abs(nums[i] - min_number);
}
return result;
}
}
Python代码
class Solution:
def minMoves2(self, nums: List[int]) -> int:
n = len(nums)
nums.sort()
result = 0
min_number = 0
min_count = int(n / 2)
if n % 2 != 0:
min_number = nums[min_count]
else:
min_number = int((nums[min_count-1] + nums[min_count] + 1) / 2 )
for i in range(n):
result += abs(nums[i] - int(min_number))
return result