2026-03-25:最小操作次数使数组元素相等Ⅲ。用go语言,给你一个整数数组 nums。 你可以进行如下操作:每次选择数组中的某一个位置 i,把该元素 nu

0 阅读3分钟

2026-03-25:最小操作次数使数组元素相等Ⅲ。用go语言,给你一个整数数组 nums。

你可以进行如下操作:每次选择数组中的某一个位置 i,把该元素 nums[i] 的值增加 1。

目标是:经过若干次操作后,让数组里所有元素都变成同一个相同的数。

问:为了使所有元素相等,所需的最少操作次数是多少?

1 <= nums.length <= 100。

1 <= nums[i] <= 100。

输入: nums = [2,1,3]。

输出: 3。

解释:

使所有元素相等的操作如下:

将 nums[0] = 2 增加 1, 变为 3。

将 nums[1] = 1 增加 1, 变为 2。

将 nums[1] = 2 增加 1, 变为 3。

现在,nums 中的所有元素都等于 3。最小总操作次数为 3。

题目来自力扣3736。

一、题目核心规则

  1. 操作方式:只能给数组里的数字加1,不能减、不能替换,每次加1算1次操作;
  2. 目标:让数组所有数字变成同一个数,求最少需要多少次操作
  3. 关键结论:要让操作次数最少,必须把所有数字都加到数组里的最大值(因为加比最大值小的数,需要减少大数,不符合只能加1的规则;加比最大值大的数,操作次数会变多)。

二、以输入 nums = [2,1,3] 为例,分步骤拆解过程

步骤1:找到数组中的最大值

数组是 [2,1,3],三个数字分别是2、1、3,其中最大值是3。 这就是我们要把所有数字都变成的目标数。

步骤2:计算数组所有元素的总和

数组元素:2 + 1 + 3 = 总和为6

步骤3:计算「最大值 × 数组长度」

数组长度是3(一共3个数字),最大值是3, 所以 3 × 3 = 9。 这个数值的含义:如果数组里3个数字全都是最大值3,总和就是9。

步骤4:计算最少操作次数

用「全是最大值的总和」减去「原数组的总和」,差值就是总操作次数: 9 - 6 = 3


三、通用解题逻辑(所有数组都适用)

  1. 第一步:遍历数组,找到里面的最大值
  2. 第二步:遍历数组,计算所有元素的总和
  3. 第三步:用「最大值 × 数组元素个数」,得到目标总和;
  4. 第四步:用「目标总和 - 原数组总和」,最终结果就是最少操作次数。

四、复杂度分析

1. 时间复杂度

  • 代码中需要遍历数组两次:一次找最大值,一次求和;
  • 遍历次数和数组长度n成正比;
  • 最终时间复杂度:O(n)(线性时间复杂度)。

2. 空间复杂度

  • 代码只使用了固定的几个变量(最大值、总和、结果),没有创建额外的数组/集合等占用空间的数据结构;
  • 额外占用的空间不随数组长度变化,是固定常量;
  • 最终空间复杂度:O(1)(常量空间复杂度)。

总结

  1. 解题核心:把所有数加到数组最大值,用目标总和减原总和得到操作次数;
  2. 示例 [2,1,3] 最终操作次数为3;
  3. 时间复杂度O(n),空间复杂度O(1)。

Go完整代码如下:

package main

import (
	"fmt"
	"slices"
)

func minMoves(nums []int) int {
	ans := slices.Max(nums) * len(nums)
	for _, x := range nums {
		ans -= x
	}
	return ans
}

func main() {
	nums := []int{2, 1, 3}
	result := minMoves(nums)
	fmt.Println(result)
}

在这里插入图片描述

Python完整代码如下:

# -*-coding:utf-8-*-

from typing import List

def minMoves(nums: List[int]) -> int:
    ans = max(nums) * len(nums)
    for x in nums:
        ans -= x
    return ans

def main():
    nums = [2, 1, 3]
    result = minMoves(nums)
    print(result)

if __name__ == "__main__":
    main()

在这里插入图片描述

C++完整代码如下:

#include <iostream>
#include <vector>
#include <algorithm>

int minMoves(std::vector<int>& nums) {
    int maxVal = *std::max_element(nums.begin(), nums.end());
    int ans = maxVal * nums.size();
    for (int x : nums) {
        ans -= x;
    }
    return ans;
}

int main() {
    std::vector<int> nums = {2, 1, 3};
    int result = minMoves(nums);
    std::cout << result << std::endl;
    return 0;
}

在这里插入图片描述