1. 题目描述
给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数。每次移动可以使 n - 1 个元素增加 1。
示例:
输入:
[1,2,3]
输出:
3
解释:
只需要3次移动(注意每次移动会增加两个元素的值):
[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-moves-to-equal-array-elements
2. 解题思路
对于有的题,在完全没有思路的情况下,通过具体的例子一步步推断,找出规律。
这题的规律如下:
- 设至少移动X次,
- 则最后达到平衡的那个数为min(nums) +X,
- 平衡后的数组元素之和为N * { min (nums) + X }, 其中N表示数组元素个数
- 移动过程中增加了X*(N - 1)
为什么移动过程增加了X(N - 1)???
例如:
[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]
1 1 1 1 1 1
每移动一次,都增加N-1,所以移动过程增加了X*(N - 1)。
可得:
sum[nums] + X*(N - 1) = N * { min (nums) + X }
则X = (sum[nums] - N*min (nums))
3. 代码实现
class Solution:
def minMoves(self, nums) -> int:
if(nums ==[] or len(nums) == 1):
return 0
N = len(nums)
sumValue = sum(nums)
minValue = min(nums)
return (sumValue - N*minValue)