945:使数组唯一的最小增量(C++)
题目地址: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; } };
-----------------------------------
心之所向,素履所往;生如逆旅,一苇以航。
------------------------------------------