LeetCode - 453 - 最小移动次数使数组元素相等(minimum-moves-to-equal-array)

Create by jsliang on 2019-07-30 09:44:222019-07-30 11:02:54

一 目录

不折腾的前端,和咸鱼有什么区别

| 目录 | | --- | | 一 目录 | | 二 前言 | | 三 解题 | | 四 执行测试 | | 五 LeetCode Submit | | 六 知识点 | | 七 解题思路 |

二 前言

  • 难度:简单

  • 涉及知识:数学

  • 题目地址:https://leetcode-cn.com/problems/minimum-moves-to-equal-array-elements/

  • 题目内容

给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数。每次移动可以使 n - 1 个元素增加 1。	
示例:	
输入:	
[1,2,3]	
输出:	
3	
解释:	
只需要3次移动(注意每次移动会增加两个元素的值):	
[1,2,3]  =>  [2,3,3]  =>  [3,4,3]  =>  [4,4,4]

三 解题

小伙伴可以先自己在本地尝试解题,再回来看看 jsliang 的解题思路。

  • 解题代码

var minMoves = function(nums) {	
  let min =  Math.min.apply(null, nums);	
  let count = 0;	
  for (let i = 0; i < nums.length; i++) {	
    count += nums[i] - min;	
  }	
  return count;	
};

四 执行测试

  1. nums: [1,2,3]

  2. return

3

五 LeetCode Submit

✔ Accepted	
  ✔ 84/84 cases passed (92 ms)	
  ✔ Your runtime beats 87.39 % of javascript submissions	
  ✔ Your memory usage beats 68.42 % of javascript submissions (37.3 MB)

六 知识点

  1. Math:JS 中的内置对象,具有数学常数和函数的属性和方法。 Math 详细介绍

七 解题思路

首先,拿到这道题,不要一脸懵逼,理解下题目中的移动,再尝试更多的移动:

案例

[1,2,3] =>	
[2,3,3] =>	
[3,4,3] =>	
[4,4,4]

尝试 1

[1,3,4] =>	
[2,4,4] =>	
[3,5,4] =>	
[4,5,5] =>	
[5,6,5] =>	
[6,6,6]

尝试 2

[1,3,5] =>	
[2,4,5] =>	
[3,5,5] =>	
[4,6,5] =>	
[5,6,6] =>	
[6,7,6] =>	
[7,7,7]

尝试 3

[2,4,6,8] =>	
[3,5,7,8] =>	
[4,6,8,8] =>	
[5,7,9,8] =>	
[6,8,9,9] =>	
[7,9,10,9] =>	
[8,10,10,10] =>	
[9,11,11,10] =>	
[10,12,11,11] =>	
[11,12,12,12] =>	
[12,13,13,12] =>	
[13,14,13,13] =>	
[14,14,14,14] =>

尝试发现规律:移动次数等于所有值减去最小值

例如:

  1. 案例移动了 3 次,为:(3 - 1) + (2 - 1)

  2. 尝试 1 移动了 5 次,为:(4 - 1) + (3 - 1)

  3. 尝试 2 移动了 6 次,为:(5 - 1) + (3 - 1)

  4. 尝试 3 移动了 12 次,为:(8 - 2) + (6 - 2) + (4 - 2)

然后,见证奇迹的时刻到了:

var minMoves = function(nums) {	
  let min =  Math.min.apply(null, nums);	
  let count = 0;	
  for (let i = 0; i < nums.length; i++) {	
    count += nums[i] - min;	
  }	
  return count;	
};

Submit 提交后:

✔ Accepted	
  ✔ 84/84 cases passed (92 ms)	
  ✔ Your runtime beats 87.39 % of javascript submissions	
  ✔ Your memory usage beats 68.42 % of javascript submissions (37.3 MB)

最后,得出结论:丫的就一找规律题~

大佬优化的代码:

var minMoves = function (nums) {	
  var min = Math.min(...nums);	
  return nums.map(function (a) {	
    return a - min;	
  }).reduce(function (a, b) {	
    return a + b;	
  })	
};

不折腾的前端,和咸鱼有什么区别!

640?wx_fmt=jpeg

jsliang 会每天更新一道 LeetCode 题解,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构。

扫描上方二维码,关注 jsliang 的公众号,让我们一起折腾!

640?wx_fmt=png

jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值