从排序数组中删除重复项
给定一个已排序的数组,删除重复的元素,使每个元素只出现一次,并返回新的长度。
请注意,即使我们希望您返回新的长度,也要确保在适当的位置更改原始数组
不要为另一个数组分配额外的空间,你必须在有常量内存的地方这样做。
我试着遵循代码,我错在哪里?
#include<iostream>
#include<vector>
using namespace std;
int removeDuplicates(vector<int> &A) {
int m=A.size();
if(m<=1) return m;
vector<int> :: iterator i=A.begin();
vector<int> :: iterator j=A.begin()+1;
vector<int> :: iterator temp;
while(i!=A.end() && j!=A.end())
{
while(j!=A.end() && *i == *j)
{
temp=j;
j++;
A.erase(temp);
}
i=j;
j++;
}
return A.size();
}
int main()
{
vector<int> vec={0,0,0,0,0,0,0,4,4,7,7,7,7,9};
cout<<"ans="<<removeDuplicates(vec);
return 0;
}
字符串
4条答案
按热度按时间huwehgph1#
当你递增
j
,然后erase
这个元素,从j+1开始的元素向下移动,你通过递增跳过了一个元素。一个更好的方法是简单地将非重复元素从一个迭代器复制到另一个迭代器,并在主循环结束时设置新的长度。您当前的方法可能是O(n^2),对于实际使用来说太慢了。
mzaanser2#
我认为这是你需要的。这个函数从尾部到头部循环数组,并计算相同的值。然后在不唯一的值上执行已经唯一的值的移位。它不会改变向量的实际大小,因为它可能会涉及向量内部内存的重新分配。
字符串
3hvapo4f3#
你被要求使用一个数组。尽管vector在很多方面都很相似,但它是不一样的。看看下面的示例代码。
此外,你被要求保持分配的内存相同。你不能确保使用vector,一旦你添加/删除元素,它的大小可以增长/收缩,当一个元素被删除时,vector后面的数组中的数据将被重新分配和重写。
字符串
slmsl1lt4#
你可以这样使用迭代器:
字符串