当前位置: 首页 > news >正文

LeetCode 453 - 最小操作次数使数组元素相等


文章目录

    • 摘要
    • 描述
      • 示例
    • 题解答案(核心思路)
      • 一句话核心结论
      • 为什么可以这么算?
        • 原操作:
        • 等价理解:
      • 问题就被简化成了什么?
      • 为什么目标是最小值?
    • 题解答案(Swift 可运行 Demo)
    • 题解代码分析
      • 1. 为什么先找最小值?
      • 2. 操作次数怎么累加?
      • 3. 为什么直接累加就行?
    • 示例测试及结果
      • 示例 1
      • 示例 2
      • 再举一个负数的例子
    • 实际场景结合
      • 1. 数据归一化
      • 2. 资源平衡问题
      • 3. 面试中的常见陷阱
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

这道题乍一看有点反直觉。

题目说的是:

每次操作让n - 1 个元素加 1

很多人第一反应是:

  • 模拟?
  • 暴力?
  • 反复加到一样?

但实际上,这道题一旦你换一个视角,就会发现答案非常简单,甚至可以一行代码解决。

核心在于一句话:

“给 n - 1 个数加 1,本质上等价于给 1 个数减 1。”

只要想通这一点,这题基本就结束了。

描述

题目给你一个整数数组nums,长度是n

规则是:

  • 每次操作,可以让数组中任意 n - 1 个元素加 1
  • 目标是让所有元素最终相等
  • 问最少需要多少次操作

示例

nums = [1,2,3]

可以这样操作:

[1,2,3] -> [2,3,3] -> [3,4,3] -> [4,4,4]

答案是3

题解答案(核心思路)

一句话核心结论

最小操作次数 = 所有元素与最小值的差之和

公式表示就是:

sum(nums) - min(nums) * n

为什么可以这么算?

关键在于等价变换

原操作:
  • 每次让n - 1个数+1
等价理解:
  • 整个数组都+1
  • 然后选 1 个数-1

整体结果没变。

也就是说:

每次操作,相当于选择一个元素,让它 -1

问题就被简化成了什么?

变成了:

每次可以让某一个数减 1
要把所有数都变成同一个值(而且操作次数最少)

那目标值选谁最合理?

答案是:数组中的最小值

为什么目标是最小值?

  • 你只能“减”,不能“加”
  • 把大的数减到最小值,代价最小
  • 如果选更小的值,反而要多做无意义的操作

题解答案(Swift 可运行 Demo)

classSolution{funcminMoves(_nums:[Int])->Int{guardletminValue=nums.min()else{return0}varresult=0fornuminnums{result+=num-minValue}returnresult}}

题解代码分析

1. 为什么先找最小值?

guardletminValue=nums.min()else{return0}

这是整个算法的“锚点”。

我们最终的目标是:

  • 所有元素 →minValue

2. 操作次数怎么累加?

result+=num-minValue

含义非常直观:

  • 当前元素是num
  • 目标是minValue
  • 每减少1,就相当于一次操作
  • 那需要num - minValue

3. 为什么直接累加就行?

因为:

  • 每次操作,只影响一个“被减”的元素
  • 不同元素之间互不干扰
  • 总操作数就是每个元素单独的“减法次数”之和

示例测试及结果

示例 1

letsolution=Solution()print(solution.minMoves([1,2,3]))

输出:

3

解释:

(1 - 1) + (2 - 1) + (3 - 1) = 0 + 1 + 2 = 3

示例 2

print(solution.minMoves([1,1,1]))

输出:

0

所有元素已经相等,不需要操作。

再举一个负数的例子

print(solution.minMoves([-1,0,2]))

计算过程:

min = -1 (-1 - -1) + (0 - -1) + (2 - -1) = 0 + 1 + 3 = 4

实际场景结合

这道题在真实开发中,其实很常见,比如:

1. 数据归一化

你有一组数:

  • 每次只能“整体提升”
  • 想让所有数据回到同一基准

这时就可以反向思考:

  • 谁是最低基准
  • 其他值要“补齐”多少

2. 资源平衡问题

比如:

  • 多个服务实例负载不均
  • 每次只能“给大多数实例加资源”

那从另一个角度看:

  • 是在“惩罚”负载最高的那个实例

3. 面试中的常见陷阱

这题非常适合考:

  • 是否能跳出题面
  • 是否具备等价转换能力
  • 是否能把复杂操作转成简单数学问题

时间复杂度

  • 找最小值:O(n)
  • 遍历求和:O(n)

总时间复杂度:

O(n)

空间复杂度

  • 只使用了常量变量

空间复杂度:

O(1)

总结

LeetCode 453 是一道非常典型的:

  • 看起来复杂
  • 实际一行公式就能解决
  • 极度考察“问题视角转换能力”的题

只要你记住这句话:

“给 n - 1 个数加 1,等价于给 1 个数减 1。”

这道题基本就是秒解。

http://www.gsyq.cn/news/132535.html

相关文章:

  • 提示工程架构师必读:Agentic AI技术生态标准化与开源社区发展报告
  • 环境搭建-运行前端工程(vue) - 努力-
  • U9C采购退货单-无来源的实现
  • @ant-design/colors 相似的库
  • AI 领域职业发展分享总结(吴恩达新课内容分享)
  • 环境搭建-运行前端工程(Nginx) - 努力-
  • C++ 工厂模式
  • 潮爸潮妈必看!2025年12月儿童羽绒服品牌测评 - 品牌测评鉴赏家
  • 【课程设计/毕业设计】基于Springboot的智能物流管理系统基于springboot的校园智能物流管理系统的设计与实现【附源码、数据库、万字文档】
  • 【课程设计/毕业设计】基于springboot的食品仓库管理系统的设计与实现Springboot+vue仓库管理系统的设计与实现【附源码、数据库、万字文档】
  • Java计算机毕设之基于Spring Boot的智慧物流系统的设计与实现基于springboot的校园智能物流管理系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • C++20和C++23 在内存管理、并发控制和类型安全相关优化方式的详细技术分析
  • 现代cpp在传统内存分配上的改进
  • L2层差错控制与HARQ协议介绍 - 实践
  • 2025年高性价比童装品牌推荐清单:宝妈闭眼入的口碑之选 - 品牌测评鉴赏家
  • 中大童童装选购指南:从材质到穿搭,宝妈必看的实用攻略 - 品牌测评鉴赏家
  • Java毕设项目推荐-基于springboot电子招投标系统基于springboot的在线招标系统的设计与实现【附源码+文档,调试定制服务】
  • 2025年秋冬必看!儿童羽绒服十大名牌大揭秘 - 品牌测评鉴赏家
  • Java毕设项目:基于springboot的物业报修系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 宝妈必藏!小童童装品牌实力排名出炉,安全舒适又时髦 - 品牌测评鉴赏家
  • Java毕设项目:基于springboot的幼儿园管理系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 【毕业设计】基于springboot的影视同人创作与分享平台系统(源码+文档+远程调试,全bao定制等)
  • 宝妈宝爸必看!超赞儿童鞋服家居服品牌大赏 - 品牌测评鉴赏家
  • 【计算机毕业设计案例】基于SpringBoot的社区线上团购系统设计与实现基于springboot的社区团购系统的设计与实现(程序+文档+讲解+定制)
  • 计算机Java毕设实战-基于SpringBoot与Vue的在线招投标系统设计与实现基于springboot的在线招标系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 【NWFSP问题】基于雪橇犬算法SDO求解零等待流水车间调度问题NWFSP附Matlab代码
  • ES知识点二
  • 【课程设计/毕业设计】基于springboot的社区团购系统的设计与实现商品管理、团长运营、订单处理、售后跟踪等功能【附源码、数据库、万字文档】
  • 休闲无聊测试AI大模型生成
  • 【油井】基于matlab模拟隐式二维油井(含渗透率和压力随时间的变化)