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的规则;加比最大值大的数,操作次数会变多)。
二、以输入 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. 时间复杂度
- 代码中需要遍历数组两次:一次找最大值,一次求和;
- 遍历次数和数组长度
n成正比; - 最终时间复杂度:O(n)(线性时间复杂度)。
2. 空间复杂度
- 代码只使用了固定的几个变量(最大值、总和、结果),没有创建额外的数组/集合等占用空间的数据结构;
- 额外占用的空间不随数组长度变化,是固定常量;
- 最终空间复杂度:O(1)(常量空间复杂度)。
总结
- 解题核心:把所有数加到数组最大值,用目标总和减原总和得到操作次数;
- 示例 [2,1,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;
}