# 945. Minimum Increment to Make Array Unique

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

## 刷题内容

> 原题连接

* https://leetcode.com/problems/minimum-increment-to-make-array-unique/

> 内容描述

```
Given an array of integers A, a move consists of choosing any A[i], and incrementing it by 1.

Return the least number of moves to make every value in A unique.

 

Example 1:

Input: [1,2,2]
Output: 1
Explanation:  After 1 move, the array could be [1, 2, 3].
Example 2:

Input: [3,2,1,2,1,7]
Output: 6
Explanation:  After 6 moves, the array could be [3, 4, 1, 2, 5, 7].
It can be shown with 5 or less moves that it is impossible for the array to have all unique values.
 

Note:

0 <= A.length <= 40000
0 <= A[i] < 40000
```

## 解题方案

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

遍历模拟就行了，注意不要一次加1，一次性全部加完，这样才不超时

```python
class Solution:
    def minIncrementForUnique(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        if not A or len(A) == 0:
            return 0
        
        A.sort()
        res = 0
        for i in range(1, len(A)):
            if A[i] <= A[i-1]:
                res += A[i-1]+1 - A[i]
                A[i] = A[i-1]+1
        return res
```





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

其实模拟也可以换一种思路，就是我先allocate好一个最大的数组，lst[i] 代表A中数字i有lst[i]个，至于为什么长度是80000，后面会说

比如输入为[1,2,2]，那么我们的lst就是[0, 1, 2, 0, 0, 0, ..... 0, 0]，说明A中数字1有一个，数字2有2个，然后我们开始遍历，
如果一个数字在A中出现的次数超过1的时候，我们就知道这个数字肯定要+1才行，所以我们就直接加上1，然后把它推到下一个index去，加到最后就是我们要的res，
至于为什么是80000，题目中说了A中最大的数字就是40000，最多拥有40000个数字，所以最坏的情况就是数字40000出现了40000次，我们一直把它往后推，
直到推到index为79999，此时数字79999出现1次，不做往后推操作


```python
class Solution:
    def minIncrementForUnique(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        if not A or len(A) == 0:
            return 0
        
        lst = [0] * 80000 # lst[i] 代表A中数字i有lst[i]个
        for i in A:
            lst[i] += 1
        res = 0
        for i in range(len(lst)):
            if lst[i] > 1:
                res += lst[i] - 1
                lst[i+1] += lst[i] - 1
        return res
```























