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.4
。code
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。element
进一步分析了一下6步是怎么得出的。
3-1=2,5-1=4,2+4 = 6。诶?巧了?
但发现对1.2.2
的状况并不符合。leetcode
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?
因而开始写代码测试 全部元素之和减去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%的代码!
虽然也不是百分之百,不过也算是提升了点效率吧?
若以为本文章对你有用,欢迎用爱发电资助。