945:使数组唯一的最小增量(C++)

自作多情 提交于 2020-03-22 10:57:05

题目地址:https://leetcode-cn.com/problems/minimum-increment-to-make-array-unique/

题目描述

给定整数数组 A,每次 move 操作将会选择任意A[i],并将其递增 1。返回使A中的每个值都是唯一的最少操作次数。

题目示例

示例 1:

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


示例 2:

输入:[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

解题思路

思路1:第一种思路是用数组统计出每个数出现的次数,然后对于每个重复出现的数,暴力地将它递增,直到它增加到一个没有重复出现的数为止。但这样的方法的时间复杂度较大,可以达到O(n^2)

思路2:另一种思路是首先对拿到的数组排序,然后用变量tmp初始化A[0],用于储存较大值,接下来,从后一个数开始遍历,如果发现后一个数比tmp大,则更新tmp,否则,将当前数A[i]调整为tmp+1所需次数,即tmp+1-A[i]

程序源码

class Solution {
public:
    int minIncrementForUnique(vector<int>& A) {
        if(A.size() < 2) return 0;
        sort(A.begin(), A.end());
        int tmp = A[0], res = 0;
        for(int i = 1; i < A.size(); i++)
        {
            if(A[i] > tmp)
            {
              tmp = A[i];
            }
            else
            {
                res += tmp - A[i] + 1;
                tmp++;
            }
        }
        return res;
    }
};
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!