news 2026/11/4 7:14:13

最小操作次数使数组元素相等 II【力扣LeetCode 每日一题】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
最小操作次数使数组元素相等 II【力扣LeetCode 每日一题】

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

网页链接

力扣LeetCode

力扣LeetCode & 每日一题,完成每日打卡,即可获得力扣积分。获得相应数量的积分,能在【力扣商店】,换取相应奖品!助力每日有题做,丰盈积分日益多!


题目描述

给你一个长度为n的整数数组nums,返回使所有数组元素相等需要的最小操作数。

在一次操作中,你可以使数组中的一个元素加1或者减1。

测试用例经过设计,以使答案在32 位整数范围内。


输入描述

一个长度为n的整数数组nums。


输出描述

返回使所有数组元素相等需要的最小操作数。


示例

示例 1

输入:

nums = [1,2,3]

输出:

2

解释:

只需要两次操作(每次操作指南使一个元素加1或减1):

[1,2,3] => [2,2,3] => [2,2,2]

示例 2

输入:

nums = [1,10,2,9]

输出:

16

数据范围

解题思路

本题是中位数贪心 + 快速选择问题。每次操作可以让一个元素加1或减1,目标是让所有元素相等,求最小总操作次数。因为总操作次数等于每个元素到最终目标值的绝对距离之和,所以问题转化为:

选择一个目标值x,使得
[
\sum_i |nums[i]-x|
]
最小。

1. 为什么中位数最优

将数组排序后,设目标值为x。对于任意一个元素,它移动到x的代价是|nums[i]-x|。绝对值函数是凸函数,所有绝对值之和也在中位数处取得最小值。

直观理解:

当n为奇数时,中位数唯一;当n为偶数时,中间两个数之间的任意值都最优,代码取下标n/2对应的下中位数即可。

2. 快速选择找中位数

如果直接排序,需要O ( n log ⁡ n ) O(n\log n)O(nlogn)时间。本题只需要找到第n/2小的元素,因此可以使用快速选择算法,期望时间复杂度为O ( n ) O(n)O(n)。

代码中:

划分后:

最终得到的x = qs(a, 0, n-1, n/2)就是中位数。

3. 计算最小操作次数

找到中位数x后,遍历数组,累加每个元素到x的绝对距离:

r+=abs(a[i]-x);

该累加值就是使所有元素都变成x所需的最少操作次数,也就是本题答案。

4. 随机化的作用

快速选择的最坏情况是O ( n 2 ) O(n^2)O(n2)。代码通过rand()随机选择枢轴,避免在特殊数据(如已排序数组)上反复出现极不平衡划分。随机化后,期望时间复杂度为O ( n ) O(n)O(n)。

5. 复杂度分析

总结

所有元素到目标值的绝对距离之和在中位数处最小。因此先用随机快速选择在O ( n ) O(n)O(n)期望时间内找到中位数,再遍历数组累加每个元素与中位数的绝对差,即为最少操作次数。该方法避免了完整排序,效率更高。

代码内容

classSolution{public:intqs(vector<int>&a,intl,intr,intk){intp=rp(a,l,r);if(p==k){returna[p];}returnp<k?qs(a,p+1,r,k):qs(a,l,p-1,k);}inlineintrp(vector<int>&a,intl,intr){inti=rand()%(r-l+1)+l;swap(a[i],a[r]);returnpt(a,l,r);}inlineintpt(vector<int>&a,intl,intr){intx=a[r],i=l-1;for(intj=l;j<r;++j){if(a[j]<=x){swap(a[++i],a[j]);}}swap(a[i+1],a[r]);returni+1;}intminMoves2(vector<int>&a){srand(time(0));intn=a.size(),x=qs(a,0,n-1,n/2),r=0;for(inti=0;i<n;++i){r+=abs(a[i]-x);}returnr;}};
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/4 7:13:41

无人机城市绿化覆盖数据集 航拍树木分割数据集 违建与树冠隐患排查 林地遥感监测数据集第10849期

文章目录航拍树木分割数据集怎么用&#xff1f;遥感影像树木实例分割数据集适合哪些项目&#xff1f;数据概括应用价值小白入手训练代码航拍树木分割数据集怎么用&#xff1f;遥感影像树木实例分割数据集适合哪些项目&#xff1f; 遥感航拍树木实例分割数据集&#xff0c;面向…

作者头像 李华
网站建设 2026/11/4 7:10:54

springboot人事管理系统27965-计算机毕业设计、课程设计

前言 ✨ 博主介绍&#xff1a;一线全栈工程师&#xff0c;毕设实战引路人。技术栈覆盖Java、Python、C#、PHP、Node.js及UniApp跨端开发&#xff0c;擅长多语言项目落地与架构设计。持续分享毕设源码、开题报告、技术选型心得与职场踩坑经验。用工程化思维写代码&#xff0c;帮…

作者头像 李华
网站建设 2026/11/4 7:10:48

Python循环与判断相关代码基础练习

第一题&#xff1a;题目&#xff1a;输入一个整数&#xff0c;判断它是正数、负数还是零&#xff0c;分别输出对应提示。代码&#xff1a;运行结果&#xff1a;第二题&#xff1a;题目&#xff1a;输入成绩&#xff08;0-100&#xff09;&#xff0c;按以下规则输出等级&#x…

作者头像 李华
网站建设 2026/11/4 7:02:47

Inter 开源字体:从选型、网页集成到商用合规的全流程实践

Inter 开源字体&#xff1a;从选型、网页集成到商用合规的全流程实践 【免费下载链接】inter The Inter font family 项目地址: https://gitcode.com/gh_mirrors/in/inter 设计评审里被问"为什么选这款字体"时&#xff0c;答案往往就藏在它的 x 高度里。Inter…

作者头像 李华