LeetCode945-使数组唯一的最小增量
问题:使数组唯一的最小增量
给定整数数组 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 <= 400000 <= A[i] < 40000
链接:https://leetcode-cn.com/contest/weekly-contest-112/problems/minimum-increment-to-make-array-unique/
分析:
1.每次move会将一个数字值加一
2.最终每个数字都不一样
3.最终结果应该是唯一的
4.增加方式不唯一,但是等价,比如从1 4 变为4 5,可以是1+4,也可以是1+3,4+1
5.操作次数其实就是最终数列和减去初始数列和
那么将原序列排序,要求递增,且差值中至少1,如果本身值就比前一个大于1,则保持,否则增加为前一个数字值+1,统计累计加值即为最终结果。
AC Code:
1 class Solution { 2 public: 3 int minIncrementForUnique(vector<int>& A) { 4 int ret = 0; 5 if (A.size() < 2) 6 { 7 return 0; 8 } 9 sort(A.begin(), A.end()); 10 int pre = A[0]; 11 for (int i = 1; i < A.size(); i++) 12 { 13 if (A[i] <= pre) 14 { 15 ret += (pre + 1 - A[i]); 16 pre += 1; 17 } 18 else 19 { 20 pre = A[i]; 21 } 22 } 23 24 return ret; 25 } 26 };
其他:
第一code:
1 typedef long long ll; 2 typedef vector<int> VI; 3 typedef pair<int,int> PII; 4 5 #define REP(i,s,t) for(int i=(s);i<(t);i++) 6 #define FILL(x,v) memset(x,v,sizeof(x)) 7 8 const int INF = (int)1E9; 9 #define MAXN 100005 10 11 class Solution { 12 public: 13 int minIncrementForUnique(vector<int>& A) { 14 if (A.size() == 0) return 0; 15 sort(A.begin(), A.end()); 16 int last = A[0]; 17 int ans = 0; 18 REP(i,1,A.size()) { 19 if (A[i] <= last) { 20 ans += last + 1 - A[i]; 21 last++; 22 } else { 23 last = A[i]; 24 } 25 } 26 return ans; 27 } 28 };

浙公网安备 33010602011771号