# 453. Minimum Moves to Equal Array Elements

**<font color=red>难度: Easy</font>**

## 刷题内容

> 原题连接

* https://leetcode.com/problems/minimum-moves-to-equal-array-elements/description/

> 内容描述

```
Given a non-empty integer array of size n, find the minimum number of moves required to make all array elements equal, where a move is incrementing n - 1 elements by 1.

Example:

Input:
[1,2,3]

Output:
3

Explanation:
Only three moves are needed (remember each move increments two elements):

[1,2,3]  =>  [2,3,3]  =>  [3,4,3]  =>  [4,4,4]
```

## 解题方案

> 思路 1
******- 时间复杂度: O(N^2*lgN)******- 空间复杂度: O(1)******

naive TLE 代码：

每次都是给并不是最大的元素加1直到全部相等。

```
class Solution(object):
    def minMoves(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        res = 0
        while(not all(x == nums[0] for x in nums)):
        	nums.sort()
        	for i in range(len(nums) - 1):
        		nums[i] += 1
        	res += 1

        return res
```



给的测试例子是 `[1,2147483647]`能不TLE么？tag 是Math，所以要用观察到的结果来做吧？

所以就是每个和最小值来比，看到底要增加多少，这是观察，但不是证明



> 思路 2
******- 时间复杂度: O(N)******- 空间复杂度: O(1)******



类证明：



其实给n-1个数字加1，效果等同于给那个未被选中的数字减1，比如数组[1，2，3], 给除去最大值的其他数字加1，变为[2，3，3]，我们全体减1，并不影响数字间相对差异，变为[1，2，2]，这个结果其实就是原始数组的最大值3自减1，那么问题也可能转化为，将所有数字都减小到最小值，这样难度就大大降低了，我们只要先找到最小值，然后累加每个数跟最小值之间的差值即可

beats 73.62%

AC代码

```python
class Solution(object):
    def minMoves(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        res = 0
        minVal = min(nums)
        for num in nums:
        	res += num - minVal
        return res
```



