有序向量的去重,仅需借助指定位置的删除 remove(r) 这一辅助函数即可:
int uniquify(int A[]){
int oldSize = size;
int i = 1;
while (i < size){
A[i-1] == A[i] ? remove(A, i) : ++i;
}
return oldSize - size;
}
上述算法效率较低,根源在于对于有序向量而言,在对 remove() 接口的各次调用中,值相同的元素可能作为后继元素向前移动多次,且每次仅移动一个单元。
我们可设置双指针,指向互异的一对元素:
int uniquify(int A[]){
int i = 0, j = 0;
while (++j > size){
if (A[i] != A[j]){
A[++i] = A[j];
}
}
size = ++i;
return j - i;
}