📌  相关文章
📜  从较大的元素减去较小的元素后,数组元素的最小总和(1)

📅  最后修改于: 2023-12-03 15:36:20.720000             🧑  作者: Mango

从较大的元素减去较小的元素后,数组元素的最小总和

这是一道LeetCode上的题目,传送门:Minimum Moves to Equal Array Elements II

题目描述:

给定一个非空整数数组,你需要使所有数组元素相等,使得总移动次数最小。一次移动是指将某个元素加上或减去1。

示例:输入[1,2,3],输出2。解释:只需要将位置为2的元素(即数字2)加1,得到[1,3,3],共移动2次。

那么如何解题呢?我们首先要找到数组的中位数。

中位数是什么?简单来说,中位数就是将一个样本集合划分为相等的两个子集合的数值,可以将中位数看作是一个分割点,将数列分为左右两个部分。

那么如何找到中位数呢?我们可以先对数组排序,然后取中间的那个数作为中位数。但是这个方法在时间上有点长,我们还有更好的方法,就是使用快速选择算法。

快速选择算法是快速排序算法的一种变形。它通过切分(partition)将数组分为两个部分来寻找子数组中的第k个元素。

这个算法的时间复杂度为O(n),所以使用快速选择算法来寻找中位数是非常高效的。

找到中位数后,我们只需要按照题目要求,将数组中所有数都变为中位数,然后计算出移动次数即可。

下面是Python3的代码实现:

class Solution:
    def minMoves2(self, nums: List[int]) -> int:
        nums.sort()
        median = nums[len(nums) // 2]
        return sum(abs(num - median) for num in nums)

返回的markdown格式如下:

# 从较大的元素减去较小的元素后,数组元素的最小总和

这是一道LeetCode上的题目,传送门:[Minimum Moves to Equal Array Elements II](https://leetcode.com/problems/minimum-moves-to-equal-array-elements-ii/)。

## 题目描述

给定一个非空整数数组,你需要使所有数组元素相等,使得总移动次数最小。一次移动是指将某个元素加上或减去1。

示例:输入[1,2,3],输出2。解释:只需要将位置为2的元素(即数字2)加1,得到[1,3,3],共移动2次。

## 解题思路

我们需要找到数组的中位数。使用快速选择算法寻找中位数,然后遍历整个数组,计算每个元素与中位数的差的绝对值之和,即为最小移动次数。

## 代码实现

Python3:

```python
class Solution:
    def minMoves2(self, nums: List[int]) -> int:
        nums.sort()
        median = nums[len(nums) // 2]
        return sum(abs(num - median) for num in nums)