[力扣]945. 使数组唯一的最小增量

最小增量

Posted by JinFei on April 10, 2020

题目描述

给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。

返回使 A 中的每个值都是唯一的最少操作次数。

Example1:

  输入:[1,2,2]
    输出:1
    解释:经过一次 move 操作,数组将变为 [1, 2, 3]。

Example2:

  输入:[3,2,1,2,1,7]
    输出:6
    解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2, 5, 7]。
    可以看出 5 次或 5 次以下的 move 操作是不能让数组的每个值唯一的。

提示

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

解题思路

  • 先排序
  • 用一个当前最大表示 应该调整的位数
class Solution {
public:
    int minIncrementForUnique(vector<int>& A) {
        if(A.size() == 0){
            return 0;
        }
        sort(A.begin(), A.end());
        int curMax = A[0];
        int res = 0;
        for(int i = 1; i < A.size(); i++){
            if(A[i] <= curMax){
                res += curMax + 1 - A[i];
            }
            curMax = max(curMax + 1, A[i]); // curMax是连续的
        }
        return res;
    }
};