题目:
给定一个长度为 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。