返回

一个技巧,搞定数组元素移动难题!LeetCode 453

见解分享


每天一道 LeetCode 算法题,欢迎来到「LeetCode 每周一题」的第 336 篇。本篇将会为大家讲解 LeetCode 上的第 453 题:最小移动次数使数组元素相等。

题目

给定一个非空整数数组 nums,你需要移动这个数组中每个元素一步,使相邻元素的绝对差值不超过 1

返回使数组所有元素相等需要的最小移动次数。

示例:

输入:nums = [1,2,3]
输出:2
解释:
一个可能的移动序列是:[1,2,3] -> [2,2,3] -> [2,2,2]

提示:

  • 1 <= nums.length <= 10^5
  • -10^9 <= nums[i] <= 10^9

思考过程

题目要求移动数组中的元素,使得相邻元素的绝对差值不超过 1,然后求出最小的移动次数。我们可以把这个过程看成把数组元素移动到一个公共值上,而这个公共值可以是数组中的任何一个元素。

方案一:

我们可以遍历数组中的每一个元素,求出移动到这个元素所需的移动次数。这个移动次数就是数组中所有元素与该元素的差值的绝对值之和。然后取所有元素中最小移动次数作为答案。

方案二:

我们可以先对数组进行排序,然后计算排序后相邻元素之间的差值,这个差值就是需要移动的次数。求出所有差值的和就是最小的移动次数。

实现

方案一:

def minMoves2(nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    min_moves = float('inf')
    for num in nums:
        moves = 0
        for other in nums:
            moves += abs(num - other)
        min_moves = min(min_moves, moves)
    return min_moves

方案二:

def minMoves2(nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    nums.sort()
    moves = 0
    for i in range(1, len(nums)):
        moves += nums[i] - nums[i - 1]
    return moves

总结

本题考察了数组操作和最优解法的求解。可以通过遍历元素或排序数组的方法求解。

感谢阅读「LeetCode 每周一题」,希望这篇文章对您有所帮助。如果您对算法题有任何疑问,欢迎随时向我提问。