news 2026/8/10 16:00:16

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 462 - 最小操作次数使数组元素相等 II


文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 为什么不是平均数?
      • 中位数为什么是最优解?
      • 为什么偶数个元素也没问题?
    • Swift 可运行 Demo 代码
    • 代码逐步解析
    • 示例测试及结果
    • 与实际场景结合
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

这道题看起来像个“数学题”,但其实更准确地说,它是一个非常典型的工程决策问题

当你可以自由地调整每个元素,目标是让整体成本最低时,应该把大家“拉”到哪里?

很多人第一反应是“取平均数”,但这道题偏偏不是。
真正的答案,其实和一个我们经常忽略、但非常重要的概念有关:中位数

描述

题目给你一个整数数组nums,你可以做的操作非常简单:

  • 每一次操作

    • 让某一个元素+1
    • 或者-1

你的目标只有一个:

最少的操作次数,让数组里的所有元素变得完全一样

注意几个隐含信息:

  • 每次操作只影响一个元素
  • 每次只加 1 或减 1
  • 最终大家要“对齐”到同一个值
  • 数组长度最多 10 万,值的范围很大

题解答案

这道题的结论非常明确,而且值得你记住:

把所有元素调整到数组的中位数,操作次数最少。

具体做法就是:

  1. 对数组排序
  2. 取中位数
  3. 累加所有元素到中位数的绝对差

题解代码分析

为什么不是平均数?

我们先从直觉入手。

很多人会想:

“让大家都变成平均数,整体差距不是最小吗?”

但这里有一个坑:
平均数并不一定是整数,而且即使是整数,也不一定最优。

举个简单的例子:

nums = [1, 2, 10] 平均数 = 4.33

如果你强行往 4 或 5 拉,左右两边的代价是不对称的。

中位数为什么是最优解?

这是这道题的核心。

如果你把数组排好序:

a1 <= a2 <= ... <= an

当你选择一个目标值x时,总操作次数是:

|a1 - x| + |a2 - x| + ... + |an - x|

这个函数在数学上有一个非常重要的性质:

当 x 取中位数时,上式取得最小值

直观理解就是:

  • 中位数左边的人,往右拉
  • 中位数右边的人,往左拉
  • 两边的“拉力”正好平衡

这和“拉一群人站成一排,站到最中间最省力”是一个道理。

为什么偶数个元素也没问题?

如果数组长度是偶数,比如:

[1, 2, 9, 10]

中位数其实是一个区间[2, 9]
你选23、…、9得到的最小操作次数是一样的

所以实现时,直接选排序后n / 2位置的值即可。

Swift 可运行 Demo 代码

importFoundationclassSolution{funcminMoves2(_nums:[Int])->Int{letsortedNums=nums.sorted()letn=sortedNums.countletmedian=sortedNums[n/2]varmoves=0fornuminsortedNums{moves+=abs(num-median)}returnmoves}}

代码逐步解析

letsortedNums=nums.sorted()

先排序,这是找到中位数的前提。
时间复杂度主要也花在这一步。

letmedian=sortedNums[n/2]
  • 奇数长度:正中间
  • 偶数长度:取右中位数即可

不需要纠结选哪一个,只要是中位数区间内的值都行。

moves+=abs(num-median)

这一步非常直观:

  • 每个元素到目标值的距离
  • 就是需要的操作次数

示例测试及结果

letsolution=Solution()print(solution.minMoves2([1,2,3]))// 2print(solution.minMoves2([1,10,2,9]))// 16print(solution.minMoves2([1,1,1]))// 0print(solution.minMoves2([1,1000000000]))// 999999999

输出结果:

2 16 0 999999999

和题目示例完全一致。

与实际场景结合

这道题在真实工程里,其实非常常见,只是你可能没意识到。

几个典型场景:

  1. 负载均衡

    • 把请求量调整到一个“最省整体迁移成本”的点
  2. 数据校准

    • 传感器读数对齐,减少整体修正代价
  3. 日志时间修正

    • 把时间戳统一到一个参考值
  4. 费用对齐

    • 多人分摊成本时,调整到“最公平、最少改动”的值

这些问题,本质上都是:

在一维数轴上,找到一个点,使得到所有点的总距离最小。

答案,几乎永远都是:中位数

时间复杂度

O(n log n)
  • 排序占主要时间
  • 后续遍历是 O(n)

空间复杂度

O(n)

排序使用了额外数组空间(Swift 的sorted())。

如果需要极致优化,可以用原地排序或快速选择算法。

总结

这道题非常适合用来建立一个重要直觉:

平均数解决的是“平方误差最小”,中位数解决的是“绝对误差最小”。

一旦你把这个区分记牢:

  • 这道题基本就是秒解
  • 很多“看起来像数学题”的工程问题,也会变得异常清晰
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/9 11:08:56

无代码二维码系统助力产品线上展示和传播

无代码二维码系统为企业提供了创新的产品展示方式。用户可以轻松生成网页二维码&#xff0c;通过扫二维码直接访问详细的产品信息。这种方式使得企业产品信息传播变得更加高效&#xff0c;不再需要依赖传统的宣传手段。客户只需拿出手机&#xff0c;即可快速获取所需的详细内容…

作者头像 李华
网站建设 2026/8/9 20:32:04

从“技术盆景”到“产业森林”:2025岁末的多智能体系统崛起与产业革命

2025年的最后几天,人工智能领域并未因岁末而沉寂,反而接连投下几枚重磅炸弹。从英伟达发布旨在构建“可扩展多智能体系统”的开源模型Nemotron 3,到浪潮开源高效多模态模型Yuan 3.0 Flash,再到工业领域首个智能体中台的正式发布。这一系列密集的进展,清晰地勾勒出一个正在…

作者头像 李华
网站建设 2026/7/31 5:54:32

微软要对 C++“动刀”了:一场写进软件工程史的重构实验

如果你以为“重写代码”只是某个团队的技术债清理&#xff0c;那你可能低估了这次事件的重量级。微软正在推进一项跨度接近十年的工程目标&#xff1a;在 2030 年之前&#xff0c;彻底清理核心代码库中的 C / C&#xff0c;并系统性迁移到 Rust。这不是一行宣言&#xff0c;而是…

作者头像 李华
网站建设 2026/8/8 15:00:05

什么是Agentic AI?通俗解释为什么企业都在做智能体

如果你最近频繁听到一个词——Agentic AI&#xff08;自主式人工智能&#xff09;&#xff0c;但又隐约觉得它不像是“又一个AI概念”&#xff0c;那你的直觉是对的。我先给一个结论式判断&#xff1a;Agentic AI不是AI的新功能&#xff0c;而是企业用AI的“新方式”。它标志着…

作者头像 李华
网站建设 2026/8/6 5:59:22

微网优化调度:Matlab + Yalmip 实现之旅

微网优化调度matlab 采用matlabyalmip编制含分布式和储能的微网优化模型&#xff0c;程序采用15分钟为采集节点&#xff0c;利用cplex求解&#xff0c;程序考虑发电机的启停约束&#xff0c;程序运行可靠在能源领域不断发展的当下&#xff0c;微网优化调度成为了热门话题。今天…

作者头像 李华
网站建设 2026/8/8 11:22:43

2025年12月23日 - 计算机组成原理

1、早期冯诺依曼机特点&#xff1a;计算机有五大部件组成&#xff1b;指令和数据以同等地位存在于存储器&#xff0c;可按地址寻址指令和数据用二进制表示&#xff1b;指令由操作码和地址码组成&#xff1b;存储程序&#xff1b;以运算器为中心。2、现代计算机的结构计算机组成…

作者头像 李华