leetcode -462. Minimum Moves to Equal Array Elements II

//解题时间:4月24日
//解法一:穷举法,效率很低:6%
//关键思路:必须以数组内其中一个值为基准不变
//解释:为什么要选里面的值,不选数组以外的值?
    var minMoves2 = function(nums) {
        let stepCounter = 0;
        let minStep = Number.MAX_VALUE;

        for(let i = 0; i <= nums.length; i++){
            stepCounter = 0;
            for(let j = 0; j < nums.length; j++){
                stepCounter += Math.abs(nums[j] - nums[i])
            }
            if(stepCounter < minStep) minStep = stepCounter
        }
        return minStep
    }
    //解题时间:4月24日,解题效率:98%
    //解法二:
    //解题思路:
    //解释:升序a,b,c.
    //以a为基准,结果为 (b-a) + (c-a)
    //以b为基准,结果为 (b-a) + (c-b)
    //以c为基准,结果为 (c-a) + (c-b)
    //对比之下,以b为基准的值最小,值为c-a
    //回答选组外值的问题,如果选组外值x,
    //如果x在组是最小,则为(c-x)+(b-x)+(a-x) > (c-a)+(b-a)+(a-a)  --->1.
    //如果x在组是最大,则为(x-c)+(x-c)+(x-a) > (c-a)+(b-a)+(c-c)  --->2.
    //如果x在组是中间,比如x只比a大,则为(c-x)+(b-x)+(x-a) > (c-b)  --->3.备注(b-x)+(x-a) 
     //=== 0
    //综上所述,以b为基准的值最小。
    var minMoves2 = function(nums) {
        if(nums.length === 1) return 0
        nums.sort((a,b) => a - b);
        let maxMIddleIndex = Math.floor(nums.length / 2);
        let minMiddleIndex = maxMIddleIndex - 1;

        let result1 = 0;
        let result2 = 0;

        for(let i = 0; i < nums.length; i++){
            result1 += Math.abs(nums[maxMIddleIndex] - nums[i]);
            result2 += Math.abs(nums[minMiddleIndex] - nums[i]);
        }
        return Math.min(result1, result2)
    }
  //解题时间:4月24日,解题效率:98.53%
/**
 * @param {number[]} nums
 * @return {number}
 */
var minMoves2 = function(nums) {
//First sort the array so we can easily identify median.
    let sortedArray = nums.sort((a,b)=>{ return a-b });
    //This is the number that we desire to move to
    let desiredNum = sortedArray[Math.floor(sortedArray.length /2)];
    let moves = 0;
    for(let i = 0; i < sortedArray.length; i++){
        if(sortedArray[i] === desiredNum){
            continue;
        }
        else {
            moves = moves + Math.abs(sortedArray[i] - desiredNum)
        }
    }
    return moves;
};

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值