Leetcode PHP題解--D107 453. Minimum Moves to Equal Array Elements
阿新 • • 發佈:2019-08-17
D107 453. Minimum Moves to Equal Array Elements
題目連結
453. Minimum Moves to Equal Array Elements
題目分析
給定一個數組,對陣列中的N-1個數組每次加1,返回最少需要多少步才能使得所有元素值相等。
思路
先想到的思路是,每一步都挑最小的n-1個元素去加。但很明顯,每一步都排序排除最大的數字,再逐個相加,重新排序…是很耗時間的。因此我麼要找到規律,簡化求出所需步驟數的方法。
我們先分析簡單點的,再推廣。
1.1.1
的情況下,直接返回即可。因為所有元素都是一樣的。
1.1.2
的情況下,只需一步即能變成2.2.2
1.2.2
的情況下,第一步是1.3.2
;第二步是2.3.3
;第三步是3.4.3
;第四步是4.4.4
。
1.3.5
,2.4.5
,3.5.5
,4.6.5
,5.7.5
,6.7.6
,7.7.7
。共6步。這裡覺得挺奇怪的,最終是7。猜了一下規律是5+3-1,即除去最小值的和減最小值是最終值,步驟是我就猜是最終值減最小值。
然而步驟數並不符合這個規律。例如1.2.2
的情況,最終為4,但步驟數並不等於3。
進一步分析了一下6步是怎麼得出的。
3-1=2,5-1=4,2+4 = 6。誒?巧了?
但發現對1.2.2
的情況並不符合。
1.3.3
,2.4.3
,3.4.4
,4.5.4
,5.5.5
。也是4步!
3+3-1=5。不對啊,那先全部加起來,再減吧:3+3+1-1-1,但還湊不成4,那就再減1吧。一共減了3個1。難道就是元素個數個1?
結果就通過了。
最終程式碼
<?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%的程式碼!
雖然也不是百分之百,不過也算是提高了點效率吧?