📅  最后修改于: 2023-12-03 15:08:03.413000             🧑  作者: Mango
给定一个整数数组 nums,每次可以将其中一个元素加一或减一,问最少需要多少步才能让数组中所有元素相等。
对于一个相等的数列,在每次操作中,选取任意两个数都是等效的。因此我们可以将问题转化为:将所有数变为其中一个数需要的操作次数。
观察题目要求,将所有数变成其中一个数,等价于所有数与这个数的差的绝对值之和最小。因此我们只需要找到一个数,使得该数与其他数的差的绝对值之和最小。
如果数组长度为奇数,则可以直接找到中位数作为目标值。如果数组长度为偶数,则需要将目标值取为两个中位数的平均数。
经过上述处理,我们就找出了目标值。将数组中所有元素与目标值的差的绝对值累加起来,即可得到最小步数。
代码中首先对数组进行了排序,然后根据数组长度的奇偶性选择中位数或平均数作为目标值。最后将数组中每个元素与目标值的差的绝对值累加起来就是所需的最小步数。
def minMoves2(nums: List[int]) -> int:
nums.sort()
n = len(nums)
mid = nums[n//2] if n % 2 != 0 else (nums[n//2-1] + nums[n//2]) // 2
res = 0
for num in nums:
res += abs(num - mid)
return res