📌  相关文章
📜  使数组中所有元素相等的最小操作(1)

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

使数组中所有元素相等的最小操作

问题描述

给定一个长度为 n 的数组,每次操作可以将其中一个元素减去 1。求使得数组中的所有元素都相等所需的最小操作次数。

解题思路

对于这个问题,我们可以从数学的角度去考虑。

假设数组中所有元素的和为 sum,数组中最小的元素为min,我们要让数组中所有元素都相等,那么每个元素最终的值一定是 sum/n。假设我们现在把数组中的 min 元素减 1,那么此时数组的和为 sum-1,min 元素的值为 min-1,数组中其他元素的值不变。此时我们得到的数组中的最小元素是 min-1,我们需要让其他元素也变为 sum/n,所以我们需要将其他元素中大于等于 sum/n 的元素都减 1。那么操作的次数就是原数组中所有大于等于 sum/n 的元素值与 sum/n 的差的总和。按照这种思路可以得到以下代码:

def minMoves(nums: List[int]) -> int:
    min_num = min(nums)
    count = 0
    for num in nums:
        count += num - min_num
    return count
时间复杂度

假设数组长度为 n,找到数组中最小元素的时间复杂度为 O(n),计算总操作次数的时间复杂度为 O(n),所以总的时间复杂度为 O(n)。

空间复杂度

空间复杂度为 O(1),只需要常数个变量存储中间变量。

测试示例
Input: [1,2,3]
Output: 3
Explanation:
Only three moves are needed (remember each move increments or decrements one element):
[1,2,3]  =>  [2,2,3]  =>  [2,2,2]  =>  [1,2,2]  =>  [1,1,2]  =>  [1,1,1]
Input: [1,2,4]
Output: 3
Input: [1,1,1000000000]
Output: 999999999

以上是使数组中所有元素相等的最小操作的详细介绍。