題目:
給定一個長度爲 n 的非空整數數組,找到讓數組所有元素相等的最小移動次數。每次移動可以使 n - 1 個元素增加 1。
示例:
輸入: [1,2,3] 輸出: 3 解釋: 只需要3次移動(注意每次移動會增加兩個元素的值): [1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]
python代碼1:
class Solution(object):
def minMoves(self, nums):
nums.sort()
c = 0
for i in range(len(nums)-1,-1,-1):
if nums[i] == nums[0]:
break
c += nums[i] - nums[0]
return c
python代碼2:
class Solution:
def minMoves(self, nums):
return sum(nums) - min(nums)*len(nums)
心得:
解法1首先對列表進行排序,nums[0]是最小的元素,nums[-1]是最大的元素,開始讓n-1個元素開始+1,但是可以注意到,nums[0]永遠是最小的元素,當nums[0]成爲最大的元素時,即結束。所以,從最後一位開始向前遍歷,當nums[0]成爲num[-1]時,除了nums[-1]本身,其他元素都加了1,此時nums[-1]已經不是最大的元素了,最大的元素已經是nums[-2],然後從nums[-2]繼續向前遍歷,如此反覆,得到結果。
解法2是數學推到的結果,首先設最小的元素是min,設最大元素位max,設列表元素的和是sum,列表的長度爲n,假設一共移動了i次,於是最終列表的每個元素爲min + i,最終列表的和爲(min+i)*n,而最終的列表之和也可以等於sum + i*(n-1),之後等號連接這兩個式子,得到結果i=sum-min*n。