453、462 给定一个数组,找到让数组所有元素相等的最小移动次数。

这篇博客探讨了一个算法问题:如何确定最少的操作次数,使得数组中的所有元素变得相同。通过深入分析和可能的解决方案,文章揭示了优化数组元素的方法和背后的数学逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

453 长为n的数组,找到让所有元素相等的最小移动次数。每次移动可以使n-1个元素增加1          点击此处返回总目录

462 长为n的数组,找到让所有元素相等的最小移动次数,其中每次可以使一个元素加1或减1

 

 

一、453 长为n的数组,找到让数组所有元素相等的最小移动次数。每次移动可以使n-1个元素增加1

【题目】

 

【分析】

每次让n-1个增加1,相当于让n-1个不动,每次让1个减少1。

每次让一个减1,最后要所有的相等。当然是,让所有的减到最小的那个值。

移动次数 = 所有值的和 - (最小值*数组长度)

 

【代码】

 

【结果】

 

 

 

二、462 长为n的数组,找到让所有元素相等的最小移动次数,其中每次可以使一个元素加1或减1

 

【题目】

 

【分析】

很多人会先下结论:在中位数的地方碰头。然后再用一堆数学证明。。。马后炮!因为你根本想不到在中位数的地方碰头啊。。。

 

其实不要整体想,要分开想。

两个人相距为x,只要两个人往中间走,无论在哪个地方碰头,两人走的步数和都为x。

 

这个题也是啊。。

 

第1个人和最后1个人,只要往中间走,在哪碰头都是最少的,步数为nums[n-1]-nums[0];
第2个人和倒数第2个人,只要往中间走,在哪碰头都是最少的,步数为nums[n-2]-nums[1];
第3个人和倒数第3个人,只要网中间走,在哪碰头都是最少的,步数为nums[n-3]-nums[2];
.....

 

因此,先排序,然后所有人往最中间走。如果不都往中间走,边边的人倒是无所谓,中间的人就多走路了。

 

 

【方法一:先排序,再计算】

 

代码:

 

结果:

 

 

【方法二:o(n)时间】

 

方法一的时间复杂度为nlogn,但是我们可以o(n)内完成。

我们学过如何o(n)的时间内找到中位数。

后面再补。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值