给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数。每次移动将会使 n - 1 个元素增加 1。
示例:
输入:
[1,2,3]
输出:
3
解释:
只需要3次移动(注意每次移动会增加两个元素的值):
[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]
法一:
###
解题思路:移动次数 m 等于 最终值 x - min(nums)
###
class Solution:
def minMoves(self, nums: List[int]) -> int:
res = 0
tmp = min(nums)
size = len(nums)
for i in range(size):
res += nums[i] - tmp # nums[i] 为 那个不移动的 1 其他的 n - 1 个数移动了
# nums[i] - min(nums) 次
# 每个数都有不移动的时候 此时把其他移动的次数记录
# 累加求和得出总移动次数
return res
法二:
###
解题思路:数学思想
最后每个数相等 为 x 共有 n = len(nums) 个 总和 x * n
现在总和 sum(nums), 要移动次数 m 次,每次移动 n - 1 个数 +1
所以 得出方程式 :
x * n == m * (n - 1) * 1 + sum(nums)
整理得出 m == sum(nums) - len(nums) * min(nums)
###
class Solution:
def minMoves(self, nums: List[int]) -> int:
return sum(nums) - len(nums) * min(nums)