📌  相关文章
📜  在最小步长中使数组元素相等(1)

📅  最后修改于: 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
复杂度分析
  • 时间复杂度:$O(n\log n)$,其中 n 为数组长度。需要对数组进行排序。
  • 空间复杂度:$O(1)$,仅需要常数级别的额外空间。