跳转至

945.使数组唯一的最小增量 (Medium)*

题目描述*

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

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

提示*

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

代码*

class Solution {
public:
    enum { MAXN = 80001 };
    int mark[MAXN] = {0};
    int minIncrementForUnique(vector<int>& A) {
        if(A.size() <= 0){
            return 0;
        }
        int maxValue = 0;
        for(size_t i = 0, n = A.size(); i < n; ++i){
            ++mark[A[i]];
            maxValue = max(maxValue, A[i]);
        }
        int ans = 0;
        maxValue <<= 1;
        for(int i = 0; i <= maxValue; ++i){
            if(mark[i] > 1){
                ans += mark[i] - 1;
                mark[i+1] += mark[i]-1;
                mark[i] = 1;
            }
        }
        return ans;
    }
};

先排序,然后让每个数组都比前面的大一。

class Solution {
private:
    void quickSort(vector<int>& nums, int l, int r) {
        if(l >= r) {
            return;
        }
        swap(nums[l], nums[l + rand() % (r - l + 1)]);
        int finalPos = l + 1;
        for(int i = l + 1; i <= r; i++) {
            if(nums[i] < nums[l]) {
                swap(nums[finalPos++], nums[i]);
            }
        }
        swap(nums[--finalPos], nums[l]);
        quickSort(nums, l, finalPos - 1);
        quickSort(nums, finalPos + 1, r);
    }
public:
    int minIncrementForUnique(vector<int>& nums) {
        int len = nums.size();
        quickSort(nums, 0, len - 1);
        int res = 0;
        for(int i = 1; i < len; i++) {
            int diff = nums[i - 1] - nums[i] + 1;
            if(diff > 0) {
                res += diff;
                nums[i] += diff;
            }
        }
        return res;
    }
};

最后更新: July 23, 2022