在刚开始考虑的时候就考虑到这道题很可能在迭代加一的部分限制时间复杂度,但是当时没有考虑出好的方法来,后来想用map减少一些情况下的复杂度,还是超时。排序排序排序!
正确代码:
class Solution {
public:
int minIncrementForUnique(vector<int> &A) {
sort(A.begin(), A.end());
int sum = 0, last = -1;
for (int i = 0; i < A.size(); i++) {
if (A[i] > last) {
last = A[i];
} else {
sum += last - A[i] + 1;
last++;
}
}
return sum;
}
};
超时代码:
class Solution {
public:
int minIncrementForUnique(vector<int> &A) {
int b[80005] = {0};
int sum = 0;
map<int, int> m;
vector<int> v;
for (int i = 0; i < A.size(); i++) {
int a = A[i];
v.push_back(a);
if (b[A[i]] != 0) {
sort(v.begin(), v.end());
vector<int>::iterator it = find(v.begin(), v.end(), a);
int index = it - v.begin();
if (index != 0) {
int c = v[index - 1];
A[i] = m.at(c) + 1;
}
}
if (A[i] < a) A[i] = a;
for (; b[A[i]] != 0; A[i]++);
sum += A[i] - a;
b[A[i]] = 1;
// for (int i = 0; i < 10; i++) {
// cout << b[i] << " ";
// }
// cout << endl;
// cout << a << " " << A[i] << endl;
m.insert(pair<int, int>(a, A[i]));
}
return sum;
}
};