Leetcode PHP题解--D107 453. Minimum Moves to Equal Array Elements

D107 453. Minimum Moves to Equal Array Elements

题目连接

453. Minimum Moves to Equal Array Elementsphp

题目分析

给定一个数组,对数组中的N-1个数组每次加1,返回最少须要多少步才能使得全部元素值相等。数组

思路

先想到的思路是,每一步都挑最小的n-1个元素去加。但很明显,每一步都排序排除最大的数字,再逐个相加,从新排序…是很耗时间的。所以我么要找到规律,简化求出所需步骤数的方法。测试

咱们先分析简单点的,再推广。.net

1.1.1的状况下,直接返回便可。由于全部元素都是同样的。
1.1.2的状况下,只需一步即能变成2.2.2
1.2.2的状况下,第一步是1.3.2;第二步是2.3.3;第三步是3.4.3;第四步是4.4.4code

1.3.52.4.53.5.54.6.55.7.56.7.67.7.7。共6步。这里以为挺奇怪的,最终是7。猜了一下规律是5+3-1,即除去最小值的和减最小值是最终值,步骤是我就猜是最终值减最小值。排序

然而步骤数并不符合这个规律。例如1.2.2的状况,最终为4,但步骤数并不等于3。element

进一步分析了一下6步是怎么得出的。
3-1=2,5-1=4,2+4 = 6。诶?巧了?
但发现对1.2.2的状况并不符合。leetcode

1.3.32.4.33.4.44.5.45.5.5。也是4步!
3+3-1=5。不对啊,那先所有加起来,再减吧:3+3+1-1-1,但还凑不成4,那就再减1吧。一共减了3个1。难道就是元素个数个1?
因而开始写代码测试 全部元素之和减去n个最小值(n为数组长度)。get

结果就经过了。io

最终代码

<?php
class Solution {

    /**
     * @param Integer[] $nums
     * @return Integer
     */
    function minMoves($nums) {
        $min = min($nums);
        return array_sum($nums) - count($nums) * $min;
    }
}

这代码竟然只战胜了60%!
我想…该不会是又min,又array_sum,又count致使的吧…
因而改为:

<?php
class Solution {

    /**
     * @param Integer[] $nums
     * @return Integer
     */
    function minMoves($nums) {
        $min = 9999999999999999999;
        $total = 0;
        $amount = 0;
        foreach($nums as $n){
            if($n<$min){
                $min = $n;
            }
            $total += $n;
            $amount++;
        }
        return $total - $amount * $min;
    }
}

就超过了80%的代码!
虽然也不是百分之百,不过也算是提升了点效率吧?

若以为本文章对你有用,欢迎用爱发电资助。

相关文章
相关标签/搜索