这是悦乐书的第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实现)的更多相关文章

  1. 【leetcode】453. Minimum Moves to Equal Array Elements

    problem 453. Minimum Moves to Equal Array Elements 相当于把不等于最小值的数字都减到最小值所需要次数的累加和. solution1: class So ...

  2. 【LeetCode】453. Minimum Moves to Equal Array Elements 解题报告(Java & Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:模拟过程 方法二:求和-n*最小值 方法三: ...

  3. 【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 ...

  4. 【LeetCode】462. Minimum Moves to Equal Array Elements II 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:排序 方法二:直接找中位数 日期 题目地址: ...

  5. LeetCode 453. 最小移动次数使数组元素相等(Minimum Moves to Equal Array Elements) 47

    453. 最小移动次数使数组元素相等 453. Minimum Moves to Equal Array Elements 题目描述 给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移 ...

  6. [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 ...

  7. LeetCode Minimum Moves to Equal Array Elements II

    原题链接在这里:https://leetcode.com/problems/minimum-moves-to-equal-array-elements-ii/ 题目: Given a non-empt ...

  8. LeetCode Minimum Moves to Equal Array Elements

    原题链接在这里:https://leetcode.com/problems/minimum-moves-to-equal-array-elements/ 题目: Given a non-empty i ...

  9. 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 ...

随机推荐

  1. 听说,霸都.NET技术社区准备搞线下聚会了?

    嗨,你听说了没有?霸都.NET技术社区准备搞线下聚会了! 啥时候的事情啊? 最近才知道的消息啊! 那你是从哪里知道的消息呢? .NET Core项目实战交流群(637326624)啊! 那这次合肥.N ...

  2. 获取Android设备唯一标识码

    概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于Android系统版本.厂商定制系统中的Bug等限制,稳定性和唯一 ...

  3. [linux]为阿里云ECS(CentOS7)配置IPv6地址

    环境为:ECS"经典网络"类型 步骤: 1. 编辑 /etc/sysctl.conf 文件,将其中三条禁用IPv6的设置更改为: net.ipv6.conf.all.disable ...

  4. Pandas 基础学习

    加载数据 Fun:pandas.read_csv >>> import pandas >>> food_info = pandas.read_csv("f ...

  5. windows查看端口占用 windows端口占用 查找端口占用程序 强制结束端口占用 查看某个端口被占用的解决方法 如何查看Windows下端口占用情况

    windows下查询端口占用情况 ,强制结束端口占用程序 查询8080端口被那个程序占用 如何强制结束windows下端口占用情况? 下面操作在win10下 在控制台执行命令   1.列出所有端口的情 ...

  6. 【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章介绍了基于Ids4密码授权模式,从使用场景.原理分析.自定义帐户体系集成完整的介绍了密码授权模式的内容,并最后给出了三个思考问题,本 ...

  7. Using rqt_console and roslaunch

    Description: This tutorial introduces ROS using rqt_console and rqt_logger_level for debugging and r ...

  8. webpack4.0各个击破(1)—— html部分

    webpack作为前端最火的构建工具,是前端自动化工具链最重要的部分,使用门槛较高.本系列是笔者自己的学习记录,比较基础,希望通过问题 + 解决方式的模式,以前端构建中遇到的具体需求为出发点,学习we ...

  9. .NET [MVC] 利用特性捕捉异常

    声明:本代码只适用于.NET MVC. 先创建一个类继承ActionFilterAttribute这个抽象类以及实现IExceptionFilter接口,并实现它的方法OnException. 代码如 ...

  10. <meta> 标签 和<title> 标签

    <meta> 标签 主流浏览器都支持 <meta> 标签. 标签定义及使用说明 元数据(Metadata)是数据的数据信息. <meta> 标签提供了 HTML 文 ...