**Qus:**从Sorted Array中删除重复项给定一个排序数组,在适当的位置删除重复项,使每个元素只出现一次,并返回新的长度。
请注意,即使我们希望您返回新的长度,也要确保在适当的位置更改原始数组
不要为另一个数组分配额外的空间,必须在具有常量内存的位置执行此操作。
我试着遵循代码,有人能帮助我哪里出错了吗??
#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;
}
6条答案
按热度按时间dffbzjpn1#
当你增加
j
,然后erase
的元素,从j+1开始的元素被向下移动。通过递增跳过了一个元素。更好的方法是简单地将非重复元素从一个迭代器复制到另一个迭代器,并在主循环结束时设置新的长度。时间复杂度为O(n^2),时间复杂度为O(n^2)。
unhi4e5o2#
我想这就是你需要的。这个函数循环数组从尾部到头部,并计算相同的值。然后在不唯一的值上执行已经唯一的值的移位。它不会改变vector的实际大小,因为它可能涉及vector内部内存的重新分配。
tkqqtvp13#
要求您使用数组。虽然向量在很多方面都很相似,但它并不相同。看看下面的示例代码。
此外,还要求您保持分配的内存相同。你不能保证使用vector,一旦你添加/删除元素,它的大小就可以增长/收缩,当一个元素被删除时,vector后面的数组中的数据将被重新分配和重写。
piah890a4#
atmip9wb5#
6kkfgxo06#
你可以这样使用迭代器: