这是悦乐书的第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 Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了

    作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.html 本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新 ...

  2. java.net.SocketException: 权限不够

    java.net.SocketException: 权限不够 一切问题的根源都是缺乏常识  0.0.....背景:今天部署一个spring cloud服务,tanainaide 服务的端口为80,然后 ...

  3. OO(object oriented面向对象)

    面向对象OO = 面向对象的分析OOA + 面向对象的设计OOD + 面向对象的编程OOP 一.OO - Object-Oriented(面向对象) 对象代表真实或抽象的事物,有一个名字(唯一标识), ...

  4. Android--从系统Gallery获取图片

    前言 在Android应用中,经常有场景会需要使用到设备上存储的图片,而直接从路径中获取无疑是非常不便利的.所以一般推荐调用系统的Gallery应用,选择图片,然后使用它.本篇博客将讲解如何在Andr ...

  5. 手工在Docker for mac上安装Kubernetes

    此文发布时间比较早,当前已经有更好的办法,请参考网页: https://github.com/AliyunContainerService/k8s-for-docker-desktop 以下为原文 通 ...

  6. 通俗易懂讲解TCP流量控制机制,了解一下

    上篇文章讲了TCP拥塞控制机制的原理,没看过的不妨看下:5分钟读懂拥塞控制,这篇文章讲讲TCP流量控制机制. 一.为什么需要流量控制? 双方在通信的时候,发送方的速率与接收方的速率是不一定相等,如果发 ...

  7. 不在models.py中的models

    概述 如何让你定义的model不在models.py中 在app的models目录中的models 你新建一个app后这个models.py就会自动建立,里面只有几行代码.那么如果是一个中大型项目,每 ...

  8. JDBC驱动程序注册 JDBC简介(二)

    使用JDBC进行数据库操作的第一步就是驱动注册(当然你得先导入JAR). 驱动注册有多种方式,第一步必然是获得正确的驱动名称与URL格式 驱动名称与URL格式 RDBMS 驱动程序名称        ...

  9. xamarin.forms之page

    最近在使用xamarin.forms做APP开发,之前做过ios的应用,虽然没做过安卓,但之前也有一点了解,什么四大组件五大布局啥的,微软的xamarin.forms的文档也挺详细的,基本都是复制粘贴 ...

  10. C#委托与事件总结

    目录 C#委托与事件的总结 1.概述 2.委托 2.1 什么是委托 2.2 委託的使用 2.3 深入理解委托 2.4 为什么要使用委托 2.5 代码清单 3.事件 3.1 事件与委托的关系 3.2 订 ...