本题目是邓俊辉《数据结构C++版》的第2章课后题[11]题 c)。要求对无序向量进行去重复操作,书中源代码是:
template<typename T>
int Vector<T>::deduplicate()
{
int oldSize = _size; //_size是向量的长度
Rank i = 1; //Rank是向量的秩,类型为int
while(i < _size)
(find(_elem[i], 0, i) < 0) ? i++ : remove(i);
//find()函数用来找出向量中秩在 [0,i) 范围内等于_elem[i] 的元素,返回该元素的秩,没找到时返回 -1。
return oldSize - _size;
}
现在要求升级该算法,使其时间复杂度降至O(nlogn)。
请高人指点一下具体的算法,并分析一下时间复杂度,谢谢。
两位回答的思路我之前考虑过,只是因为无序向量去重操作后向量应该还是保持原来无序的样子,如果先排序再去重,向量就和原来不同了。请问这个地方怎么解决?
请问如果想保证去重操作后向量维持原来的顺序,可以做到么?
追答这是没有现成的东西可以用。你可以存储一个pair,一个是数据,一个是原始顺序,去重之后再按原始顺序排序就可以了,复杂度不变。