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%的代碼!
雖然也不是百分之百,不過也算是提升了點效率吧?

若以爲本文章對你有用,歡迎用愛發電資助。

相關文章
相關標籤/搜索