leetcode 945. 使数组唯一的最小增量
题目详情
题目链接
给定整数数组 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
我的代码
class Solution {
public:
int minIncrementForUnique(vector<int>& A) {
vector<int> nums(65535, false);
int res = 0;
for (int a: A) {
if (!nums[a]) {
nums[a] = true;
continue;
}
for (int i = a + 1; i <= 65535; ++i) {
if (!nums[i]) {
res += (i - a);
nums[i] = true;
break;
}
}
}
return res;
}
};
我的成绩
执行结果:通过
执行用时 : 2140 ms, 在所有 C++ 提交中击败了5.26%的用户
内存消耗 : 43.4 MB, 在所有 C++ 提交中击败了6.25%的用户
一些想法
- 本道题踩了一个坑,虽然输入的数字是小于40000,但最后结果内的的数字不一定是小于40000。
- 本题我的做法比较简单,即判断当前数字是否之前已经存在,如果存在则加一继续判断,直至找到还不存在的数字。
执行用时为 44 ms 的范例
class Solution {
public:
int minIncrementForUnique(vector<int>& A) {
int i;
int min;
int counts[80000];
memset(counts, 0, sizeof(int) * 80000);
for(auto i: A) counts[i]++;
min = 0;
for(i = 0; i < 80000; i++)
{
if(counts[i] <= 1) continue;
min += counts[i] - 1;
counts[i + 1] += counts[i] - 1;
}
return min;
}
};
思考
- 范例做法确实要比我的好,只做了两次循环。