在剛開始考慮的時候就考慮到這道題很可能在迭代加一的部分限制時間複雜度,但是當時沒有考慮出好的方法來,後來想用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;
}
};