leetcode-453-Minimum Moves to Equal Array Elements
题目描述:
Given a non-empty integer array of size n, find the minimum number of moves required to make all array elements equal, where a move is incrementing n - 1 elements by 1.
Example:
Input: [1,2,3]Output: 3Explanation: Only three moves are needed (remember each move increments two elements):[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]
要完成的函数:
int minMoves(vector<int>& nums)
说明:
1、这道题看起来有点意思。
我们先举一个[1,2,3,4]的例子,看能不能发现点什么规律。
[1,2,3,4],挑选里面最小的3个元素+1
[2,3,4,4],挑选里面最小的3个元素+1
[3,4,5,4],挑选里面最小的3个元素+1
[4,5,5,5],挑选里面最小的3个元素+1
[5,6,6,5],挑选里面最小的3个元素+1
[6,7,6,6],挑选里面最小的3个元素+1
[7,7,7,7],挑选里面最小的3个元素+1
我们可以发现在处理vector的时候,总是会选择里面最小的n-1个元素来+1。这样子处理,直觉告诉我们这是最快的。
的确如此,假如在[3,4,5,4]这一步,我们不选择最小的三个元素来处理,而是选择4,5,4来+1,结果会是[3,5,6,5]。后续无论怎样处理都达不到[7,7,7,7]了。
选择最小的n-1个元素来处理,这是最快达到“所有数值都相等”的方法。
按理来说,知道了这些信息,我们就可以写代码来模拟这个过程:
每次找到最大元素,然后把除了最大元素的其他元素+1。
不断重复处理,直到所有元素都相等。
输出重复处理的次数。
但是总觉得这里面有一缕能够直接计算输出的味道。
我们再回过头来看一下。
2、数学方法
n-1个数+1,如果重复处理count次,那么就是(n-1)*count,加上原本n个数的数值,加完结果会等于所有相等的数(设为t)*n。
也就是(n-1)*count+(n个数的数值)=t*n。
关键就在于t的值了。
我们回过头看一下1中举的例子,每一次的处理,最小值1都参与,一共加了6次,最后变成7。
直觉告诉我们,最开始时候最小值会加上count次,也就是t应该是min+count。
如果这个结论成立的话,上述式子就可以解出count来了。
我们尝试一下,代码如下:
int minMoves(vector<int>& nums) {int min1=nums[0];//记录最小值int len=nums.size();int result=nums[0];//记录nums中的数值的和for(int i=1;i<len;i++){result+=nums[i];if(nums[i]<min1)min1=nums[i];}return result-min1*len;//我们要求的count}
submit,实测51ms,beats 94.55% of cpp submissions。通过了所有测试样例……
我们的直觉为什么是成立的?笔者在推[1,2,3,4]的时候,觉得直觉的想法应该大致是成立的,但是想给出一个数学上的解释就比较麻烦了。
姑且放过笔者吧……日后被remind到简单又好懂的推理方法再来补充。
转载于:https://www.cnblogs.com/chenjx85/p/8920996.html
leetcode-453-Minimum Moves to Equal Array Elements相关推荐
- LeetCode 453. Minimum Moves to Equal Array Elements
题目: Given a non-empty integer array of size n, find the minimum number of moves required to make all ...
- leetcode 462. Minimum Moves to Equal Array Elements II
这道题目和leetcode453是有联系的,虽然这道题难度为中等,但是我感觉初等难度的453绕的弯子更大一些. 题目:Given a non-empty integer array, find the ...
- LeetCode 462 Minimum Moves to Equal Array Elements II
问题:给出一个数组,每次可以从中选择一个数+1或者-1,使得数组中的所有元素相等,要求操作次数最少. 思路:假设元素分别为x1,x2,...,xn,元素最终等于x,则要求|x1-x|+|x2-x|+. ...
- 453. Minimum Moves to Equal Array Elements (python)
- leetcode 453,462. Minimum Moves to Equal Array Elements I, II | 453, 462. 最少移动次数使数组元素相等(图解)
453. Minimum Moves to Equal Array Elements https://leetcode.com/problems/minimum-moves-to-equal-arra ...
- LeetCode Minimum Moves to Equal Array Elements II
原题链接在这里:https://leetcode.com/problems/minimum-moves-to-equal-array-elements-ii/ 题目: Given a non-empt ...
- C#LeetCode刷题之#453-最小移动次数使数组元素相等(Minimum Moves to Equal Array Elements)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3877 访问. 给定一个长度为 n 的非空整数数组,找到让数组所有 ...
- java求最小步数,使数组值相等的最小步数 Minimum Moves to Equal Array Elements
问题: Given a non-empty integer array of size n, find the minimum number of moves required to make all ...
- LeetCode Find Minimum in Rotated Sorted Array II
Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allowed? Woul ...
最新文章
- ZooKeeper的一致性算法赏析
- 语言 上课点名 缺勤_主播日记5 | “云端”传递的C语言程序设计实验课
- 2019年山西计算机二级报名入口,2019年下半年山西省计算机二级考试教程:Web程序设计...
- VTK:图片之DrawOnAnImage
- 清华经管计算机金融专业,非量化背景拿下MIT MFin的清华经管学姐,详解MIT金融项目优劣和职业方向...
- Linux 命令之 less -- 分屏上下翻页浏览文件内容(查看文件内容/显示文件内容)
- css blink不闪烁_使它闪烁HTML教程–如何使用Blink标签以及代码示例
- 集群搭建预备操作:在私有云上创建与配置虚拟机
- C++四种强制类型转换解析
- python多重继承_Python多重继承
- Sketch 76 for mac(矢量绘图设计软件)
- 用ASP.NET刷新页面的几种有效方法
- 数据挖掘概念与技术第三版 范明、孟晓峰译 第三章习题答案
- 游戏里的攻防-检测与反检测
- Excel表中只能选择固定内容
- Win11如何查看硬盘型号?Win11查看硬盘型号步骤
- HtmlHelper用法大全(下)
- 开发与测试如同左手和右手
- FIL是否值得长期持有以及未来评估
- 小程序成四大行业商家标配,小程序代理市场如何
热门文章
- android 自定义paint,Android自定义View中Paint、Rect、Canvas介绍(一)
- uc3842改可调电源教程_《学习笔记》--DC/DC电源电路设计实例
- python压缩教程_无需压缩软件,用python帮你操作压缩包
- java开发app的缺点_App原生开发的优缺点有哪些
- android system_server中的dump_Android 10.0系统启动之SystemServer进程(二)
- .net framework 4.0安装_R4.0的源码安装——以mac为例
- java mvc jquery weui_WEUI 事件绑定
- 恢复误删的Windows文件
- 腾讯开源业内最大多标签图像数据集,附ResNet-101模型
- 大限将至?Google先知