首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >2026-03-25:最小操作次数使数组元素相等Ⅲ。用go语言,给你一个整数数组 nums。 你可以进行如下操作:每次选择数组中的某一个位置 i,把

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

作者头像
福大大架构师每日一题
发布2026-03-31 21:20:39
发布2026-03-31 21:20:39
260
举报

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算1次操作;
  2. 2. 目标:让数组所有数字变成同一个数,求最少需要多少次操作
  3. 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. 1. 第一步:遍历数组,找到里面的最大值
  2. 2. 第二步:遍历数组,计算所有元素的总和
  3. 3. 第三步:用「最大值 × 数组元素个数」,得到目标总和;
  4. 4. 第四步:用「目标总和 - 原数组总和」,最终结果就是最少操作次数。

四、复杂度分析

1. 时间复杂度

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

2. 空间复杂度

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

总结

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

Go完整代码如下:

.

代码语言:javascript
复制
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完整代码如下:

.

代码语言:javascript
复制
# -*-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++完整代码如下:

.

代码语言:javascript
复制
#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;
    return0;
}
在这里插入图片描述
在这里插入图片描述

·


我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

·

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、题目核心规则
  • 二、以输入 nums = [2,1,3] 为例,分步骤拆解过程
    • 步骤1:找到数组中的最大值
    • 步骤2:计算数组所有元素的总和
    • 步骤3:计算「最大值 × 数组长度」
    • 步骤4:计算最少操作次数
  • 三、通用解题逻辑(所有数组都适用)
  • 四、复杂度分析
    • 1. 时间复杂度
    • 2. 空间复杂度
    • 总结
  • Go完整代码如下:
  • Python完整代码如下:
  • C++完整代码如下:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档