博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode算法题-Minimum Moves to Equal Array Elements(Java实现)
阅读量:6877 次
发布时间:2019-06-26

本文共 1806 字,大约阅读时间需要 6 分钟。

这是悦乐书的第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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

转载于:https://www.cnblogs.com/xiaochuan94/p/10280343.html

你可能感兴趣的文章
为什么比别人办事效率慢?因为你没用这几款强大的搜索软件!
查看>>
linux菜鸟基础学习 (二) 中篇
查看>>
配置网络
查看>>
0021-使用JDBC向Kudu表插入中文字符-cast的秘密
查看>>
Kubernetes 1.14发布:对Windows节点的生产级支持、Kubectl更新与持久本地卷
查看>>
PHP获取未来七天的日期和星期
查看>>
web防火墙的开通和部署
查看>>
驰骋工作流引擎,表单引擎工作事务单元测试报告
查看>>
删除的文件如何恢复?详细方法介绍
查看>>
PDF转换CAD有什么方法
查看>>
物联网不可忽视的安全隐患
查看>>
发票扫描仪的前景
查看>>
MySQL常见的面试题+索引原理分析!
查看>>
主从延迟复制 -- 数据恢复测试!
查看>>
丢了翅膀,他仍是天使
查看>>
适配不同分辨率的Android手机的简单处理方法
查看>>
台湾域名总量近期动态:总量达7万个 曾出现负增长
查看>>
JAX-WS Provider和Dispatch
查看>>
Flask表单处理Flask-WTF
查看>>
双Y轴图表的是与非
查看>>