📌  相关文章
📜  从数组元素中减去以使所有数组元素相等的值的最小总和(1)

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

从数组元素中减去以使所有数组元素相等的值的最小总和

问题描述

给定一个长度为 n 的数组,你需要找到一个整数 x,使得将数组中的每个元素减去 x 后,所有元素都相等。计算将数组中的元素减去 x 后的最小总和。

例如,给定数组 nums = [1,2,3],你可以将 x 设为 2,那么将数组中的每个元素减去 2 后,所有元素都变成了 1,此时数组的和为 3,是最小的。

示例 1:

输入: nums = [1,2,3] 输出: 3 解释: 将 x 设为 2,那么将数组中的每个元素减去 2 后,所有元素都变成了 1,此时数组的和为 3,是最小的。

示例 2:

输入: nums = [2,2,2,2,5] 输出: 3 解释: 将 x 设为 2,那么将数组中的每个元素减去 2 后,所有元素都变成了 2,此时数组的和为 15,将 x 设为 3 也可以得到相同的结果。

解法

假设数组中每个元素减去 x 后的和是 s,则数组中的每个元素最终的值是 s/n。为了使 s 最小,我们需要找到 s/n 的最小值,即找到数组中的最小数值。

时间复杂度:O(n),空间复杂度:O(1)。

代码实现:
def minMoves(nums: List[int]) -> int:
    return sum(nums) - min(nums) * len(nums)
function minMoves(nums) {
    return nums.reduce((acc, val) => acc+val, 0) - Math.min(...nums) * nums.length;
}
public int minMoves(int[] nums) {
    int min = nums[0];
    int sum = 0;
    for (int num : nums) {
        if (num < min) {
            min = num;
        }
        sum += num;
    }
    return sum - min * nums.length;
}