LeetCode算法题-Minimum Moves to Equal Array Elements(Java实现)
这是悦乐书的第233次更新,第246篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第100题(顺位题号是453)。给定大小为n的非空整数数组,找到使所有数组元素相等所需的最小移动数,其中移动将n-1个元素递增1。例如:
输入:[1,2,3]
输出:3
说明:只需要三个动作(记住每个动作增加两个元素):
[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
特殊情况:如果nums中没有任何元素,直接返回0。
正常情况:每次使n-1个元素增加1,最后使得每个元素都相等,这与每次使一个元素减1,最后使得全部元素等于数组中的最小值是一样的效果。所以,我们可以先将数组中的最小值找到,然后用数组中的每个元素去减最小值,得到的差进行累加,最后的和就是最小移动步数。
public int minMoves(int[] nums) {
if (nums.length == 0) {
return 0;
}
int minNum = nums[0];
for (int n : nums) {
minNum = Math.min(minNum, n);
}
int result = 0;
for (int n : nums) {
result += n - minNum;
}
return result;
}
03 第二种解法
将sum定义为数组所有元素之和,minNum作为数组中的最小数字,n是数组的长度,移动m步,最后得到所有数字为x,我们将得到以下等式:
sum + m ×(n - 1)= x × n
实际上,
x = minNum + m
最后,我们会得到
m = sum - minNum × n
以上的推导过程大家可以使用归纳法,多列举些例子进行推导。因此,我们只需要知道数组元素之和、数组元素最小值即可,就可以将最小步数求出来。
public int minMoves2(int[] nums) {
int sum = 0;
int minNum = nums[0];
for(int n : nums){
sum += n;
minNum = Math.min(minNum, n);
}
return sum - nums.length*minNum;
}
04 第三种解法
此解法的思路和第二种解法的思路一致,只是获取数组中最小值时有一点差别。
public int minMoves3(int[] nums) {
int minNum = Integer.MAX_VALUE;
int sum = 0;
for (int n : nums) {
if (n < minNum) {
minNum = n;
}
sum += n;
}
return sum - minNum*nums.length;
}
05 第四种解法
更加疯狂的解法,一行代码搞定,利用流的相关操作,但是思路和第二种、第三种解法是一样的。此解法的效率并没有比上面的解法高多少,只是种思路,实际开发中,使用第二种解法或者第三种解法即可。
public int minMoves4(int[] nums) {
return IntStream.of(nums).sum() - nums.length * IntStream.of(nums).min().getAsInt();
}
06 小结
算法专题目前已日更超过三个月,算法题文章100+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Minimum Moves to Equal Array Elements(Java实现)的更多相关文章
- 【leetcode】453. Minimum Moves to Equal Array Elements
problem 453. Minimum Moves to Equal Array Elements 相当于把不等于最小值的数字都减到最小值所需要次数的累加和. solution1: class So ...
- 【LeetCode】453. Minimum Moves to Equal Array Elements 解题报告(Java & Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:模拟过程 方法二:求和-n*最小值 方法三: ...
- 【LeetCode】462. Minimum Moves to Equal Array Elements II
Given a non-empty integer array, find the minimum number of moves required to make all array element ...
- 【LeetCode】462. Minimum Moves to Equal Array Elements II 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:排序 方法二:直接找中位数 日期 题目地址: ...
- LeetCode 453. 最小移动次数使数组元素相等(Minimum Moves to Equal Array Elements) 47
453. 最小移动次数使数组元素相等 453. Minimum Moves to Equal Array Elements 题目描述 给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移 ...
- [LeetCode] Minimum Moves to Equal Array Elements II 最少移动次数使数组元素相等之二
Given a non-empty integer array, find the minimum number of moves required to make all array element ...
- LeetCode Minimum Moves to Equal Array Elements II
原题链接在这里:https://leetcode.com/problems/minimum-moves-to-equal-array-elements-ii/ 题目: Given a non-empt ...
- LeetCode Minimum Moves to Equal Array Elements
原题链接在这里:https://leetcode.com/problems/minimum-moves-to-equal-array-elements/ 题目: Given a non-empty i ...
- 453. Minimum Moves to Equal Array Elements 一次改2个数,变成统一的
[抄题]: Given a non-empty integer array of size n, find the minimum number of moves required to make a ...
随机推荐
- python判断文件是否存在
# 判断文件是否存在 def judgejson(jsonpath): # 如果存在就返回True,不存在就返回False return os.path.exists(jsonpath)
- Elasticsearch之删除索引
1. #删除指定索引 # curl -XDELETE -u elastic:changeme http://localhost:9200/acc-apply-2018.08.09 {&qu ...
- 并发编程(六)——AbstractQueuedSynchronizer 之 Condition 源码分析
我们接着上一篇文章继续,本文讲讲解ReentrantLock 公平锁和非公平锁的区别,深入分析 AbstractQueuedSynchronizer 中的 ConditionObject 公平锁和非公 ...
- C语言实现链队列的初始化&进队&出队
/*链表实现队列的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typed ...
- springmvc 项目完整示例02 项目创建-eclipse创建动态web项目 配置文件 junit单元测试
包结构 所需要的jar包直接拷贝到lib目录下 然后选定 build path 之后开始写项目代码 配置文件 ApplicationContext.xml <?xml version=" ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU特性介绍(4)- RT105x选型
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的RT105x选型. 大家都知道i.MX RT105x是i.MX RT系列第一款产品,在提这款产品特性的 ...
- Kafka基础入门
1. Kafka简介 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作 ...
- Spring基础系列--AOP织入逻辑跟踪
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9619910.html 其实在之前的源码解读里面,关于织入的部分并没有说清楚,那些前置.后 ...
- [MySQL] mysql int后面的数字与前导零填充
1.int或者tinyint等数值型字段的存储范围已经是固定的,和类型相关2.后面的数字只与显示有关,并且是在开启了zerofill前导零填充的前提下 3.显示的时候,在前面用0补全了 create ...
- Java学习笔记之——TreeMap
TreeMap: 特点:存储时,按照键排序 底层使用一个红黑树,特殊的而二叉树 排序跟comparable,comparator有关系 如果需要在添加时进行排序,使用hashMap即可 构造方法: T ...