leetcode
leetcode 1401 ~ 1450
使数组中所有元素相等的最小操作数

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

难度:

标签:

题目描述

代码结果

运行时间: 19 ms, 内存: 16.1 MB


/*
 * 思路:
 * 1. 根据题意,数组 arr 的元素为奇数序列 [1, 3, 5, ..., (2n-1)]。
 * 2. 目标是将所有元素变为相等,由于数组的平均值是中位数,因此最终所有元素应变为中位数。
 * 3. 计算中位数后,计算每个元素与中位数的差值之和即可得到最小操作数。
 * 4. 使用 Java Stream API 实现。
 */

import java.util.stream.IntStream;

public class Solution {
    public int minOperations(int n) {
        int median = n; // 因为 arr[i] = (2 * i) + 1,数组中位数是 n
        return IntStream.range(0, n)
                        .map(i -> Math.abs((2 * i) + 1 - median))
                        .sum() / 2; // 每次操作会使两个元素接近,所以除以 2
    }
}

解释

方法:

该题目的解决思路是通过数学方法计算使数组中所有元素相等的最小操作数。首先,给定数组 arr 是由奇数构成,其中 arr[i] = (2*i) + 1。数组的总和是由首项1,末项(2*n - 1)的等差数列和公式计算得出。当n为奇数时,目标值是数组总和除以n的结果;当n为偶数时,目标值同样是数组总和除以n。然后,通过计算达到目标值需要的操作数,发现当n为偶数时,操作数是n的平方除以4;当n为奇数时,操作数是(n的平方减1)除以4。

时间复杂度:

O(1)

空间复杂度:

O(1)

代码细节讲解

🦆
在解题代码中,为什么在n为奇数时使用的公式是`(n的平方减1)除以4`,而在n为偶数时是`n的平方除以4`?这两个公式的数学逻辑是什么?
当n为偶数时,数组中间的元素就是平均值,而当n为奇数时,中间元素稍微偏离平均值。因此,n为偶数时,操作数为`n^2 / 4`,这是因为每一对相对于中心对称的元素(如数组的第一个和最后一个)都将被调整到中心值,每对的总调整量相同。而n为奇数时,由于中间的元素已经是目标平均值,剩余元素的调整需要稍微更多的操作,因此使用`(n^2 - 1) / 4`来调整,计算中考虑了中心元素不需要变动。
🦆
题解中提到的目标值是数组总和除以n,这个目标值是否总是一个整数?如果不是,怎样处理?
在这个特定问题中,目标值总是一个整数。因为数组是由连续奇数构成的,其总和是一个等差数列的和,这个和可以被n整除。这是由于等差数列和的公式为`(首项 + 末项) * 项数 / 2`,在这里首项和末项分别是1和(2n-1),项数是n,因此`(1 + (2n-1)) * n / 2 = n^2`,总和除以n等于n,是整数。
🦆
题解中提到操作数的计算,这里的操作数是如何定义的?例如,操作数是指单次操作还是总的操作步数?
操作数是指使得所有数组元素达到目标平均值所需的总操作步数。在这个题目中,操作是指将一个元素值增加或减少以达到目标值,计算总操作步数是通过考虑所有元素与目标平均值之间的差值来实现的。操作数累计了这些差值的绝对值的总和,分配到每一对对称元素上。
🦆
解题思路中提到数组总和的计算,具体是如何计算这个等差数列的和的?能否展示这一计算的详细步骤?
等差数列的和可以使用公式计算:`(首项 + 末项) * 项数 / 2`。在本题中,数组由连续的奇数构成,首项是1,末项是`(2n-1)`,项数是n。将这些值代入公式中,得到数组总和为:`(1 + (2n-1)) * n / 2 = n * n = n^2`。这就是数组的总和,也是通过数学公式直接计算得到的结果。

相关问题