leetcode945题,使数组唯一的最小增量。
给出一个数组Arr[3,2,1,2,1,7],每次只能某个元素+1,使最后每个元素各不相同。
参考作者题解,有那么一点并查集的味道。
1、申请一个数组tmp,初始化为-1;
2、如果b=Arr[i],在tmp的下标中没有存,那么直接放进去,并且置为b+1。暗示下次如果还有这个元素想来这个坑,需要去b+1处找找位子。
3、如果已经存过loc = tmp[b]已经有数据了,那么去找loc是否有戏,如果没戏,就去找tmp[loc]给出的位置。另外,不要忘记对中间的这些tmp[loci]进行刷新
#define MAXLEN 50002
int minIncrementForUnique(int* A, int ASize) {
int i, sum, loc, locstead, b, ltmp;
int tmp[MAXLEN];
for (i = 0; i < MAXLEN; i++) {
tmp[i] = -1;
}
sum = 0;
for (i = 0; i < ASize; i++) {
b = A[i];
if (tmp[b] == -1) {
tmp[b] = b + 1;
continue;
}
locstead = loc = tmp[b];//b给的提示
if (tmp[loc] == -1) {
//如果b给的提示是对的,直接占坑
sum += loc - b;
tmp[loc] = loc + 1;
continue;
}
while (tmp[loc] != -1) {
//如果b给的提示已经不对了,就往下找
loc = tmp[loc];
}
while (tmp[locstead] != -1) {
//刷新
ltmp = tmp[locstead];
tmp[locstead] = loc + 1;
locstead = ltmp;
}
tmp[loc] = loc + 1;
sum += loc - b;
}
return sum;
}