题目:
代码(排序后遍历一次):
class Solution {
public:
int minIncrementForUnique(vector<int>& A) {
if(A.size()==0) return 0;
sort(A.begin(),A.end());
int ans=0;
for(int i=0;i<A.size()-1;i++){
if(A[i]>=A[i+1]){
ans+=(A[i]-A[i+1]+1);
A[i+1]=A[i]+1;
}
}
return ans;
}
};
榜首代码:
class Solution {
public:
// 空间换时间
int minIncrementForUnique(vector<int>& A) {
if (A.size()<=1) return 0;
int a[40000]; memset(a, -1, sizeof(a));
int min=A[0],max=A[0];
for (int i=0; i<A.size(); ++i) {
if (max<A[i]) max=A[i];
if (min>A[i]) min=A[i];
++a[A[i]];
}
int sum_u=0, n_u=0, sum_t=0, t=0;
for (int i=min; i<=max; ++i) {
if (0 == a[i]) continue;
if (a[i] > 0) sum_u += a[i]*i, n_u += a[i];
else if (n_u>0) sum_t += i, --n_u;
}
if (n_u>0) sum_t += (2*max+1+n_u)*n_u/2;
return sum_t-sum_u;
}
// // 排序思路,
// int minIncrementForUnique(vector<int>& A) {
// if (A.size()<=1) return 0;
// sort(A.begin(),A.end());
// int sum_u=0, n_u=0, sum_t=0, t=0, u_size=0;
// for (int i=1; i<A.size(); ++i) {
// t = A[i]-A[i-1];
// if (0 == t) sum_u += A[i], ++n_u;
// else if (1 == t || 0 == n_u) continue;
// else {
// u_size = min(n_u,t-1);
// n_u -= u_size;
// sum_t += (2*A[i-1]+1+u_size)*u_size/2;
// }
// }
// if (n_u>0) sum_t += (2*A[A.size()-1]+1+n_u)*n_u/2;
// return sum_t-sum_u;
// }
};