【Leetcode】使数组唯一的最小增量(每日一题)

题目链接:使数组唯一的最小增量


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

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


题解:

1、暴力sort。O(nlogn)。排序以后,如果当前数字<=前一个数字,那么就把当前的数字变成前一个数字+1。

增量就是A[i-1]+1-A[i].遍历以后的结果就是要求的最小增量。跑了80ms

2、用一个数组表示hash。空间换时间。O(n)。

我们对hash数组进行移动操作,每次对hash[i]>1的数字进行操作,只保留一个数字,其余的加入到hash[i+1],因为移动增量是1,所以只要知道有多少个数字移动就可以了。这里给到40000了,所以总的hash数组可能到80000.这个跑了60ms


代码:

class Solution {
public:
    int minIncrementForUnique(vector<int>& A) {
        int len = A.size();
        sort(A.begin(),A.end());
        int ans = 0;
        for(int i = 1; i < len ;i++){
            if(A[i] <= A[i-1]){            
                ans += A[i-1]+1 - A[i];
                A[i] = A[i-1] + 1;
            }
        }
        return ans;
    }
};


OR


class Solution {
public:
    const int maxn = 80010;
    int minIncrementForUnique(vector<int>& A) {
        int len = A.size();
        int cnt[maxn] ={0};
        for(int i = 0; i < len ;i++){
            cnt[A[i]]++;
        }
        int ans = 0;
        for(int i = 0 ;i <= 80000;i++){
            if(cnt[i] > 1){
                ans += cnt[i] - 1;
                cnt[i+1] += cnt[i]-1;
                cnt[i] = 1;
            }
        }
        return ans;
    }
};

 

posted @ 2020-03-22 23:17  甜酒果。  阅读(181)  评论(0编辑  收藏  举报