算法题Day2-最小移动次数

给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数。每次移动可以使 n - 1 个元素增加 1

示例:

输入:[1,2,3]
输出:3
解释:只需要3次移动(注意每次移动会增加两个元素的值):

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

自己的思考:

一、

刚开始哈,我也没管太多(增加1)。

思路是这样的
先排序、找到最小值、让剩下的数都减去最小值
继续排序、重复

直到 最小值-最大值==0结束

。。。。完了之后吧、我的错误代码陷入了死循环

二、

先不管最后的结果是哪个数

先排序
比如数组[1,3,5]
找到最大的数、这里为5

要想让剩下的数都变成一样的
那么对于3来说,它需要加2次1
对于1来说,需要加4次1

所以等到最后都变成5时
一共加了2+4次

也就可以推出:移动次数=(最大值-剩下值们)的和

 function FindMinMoves(arr) {
    arr.sort();
    var sum=0;
    for(var j=0;j<arr.length-1;j++){
      sum=sum+arr[arr.length-1]-arr[j];
    }
    return sum;
  }

还有一种解法、一个公式

移动次数=和-最小值*长度

我刚开始其实哈没明白这公式为啥这样写
可能是数学没学好
完了就自己分析、推呗


数组[1,3,5]

按照公式来算

MOVES=(1+3+5)-1*3=6

(最小值*长度) =》假如数组中的值都为最小值、和的结果是多少

(和-最小值 长度) =》差就是剩下的数和最小值差的和


代码
 function FindMinMoves(arr){
    var Sum=0;
    for(var t=0;t<arr.length;t++){
      Sum+=arr[t];
    }
    return Sum-arr[0]*arr.length;
  }

题目来源==》公众号

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值