删除排序数组中的重复项
先修知识
- 迭代器的变量定义:auto i=vector.begin();使用auto来自动分配变量类型;
- 删除容器中的元素erase():vector.erase(iterator);这里是删除迭代器iterator指定的元素,iterator不能为end(),必须是真实元素。vector.erase(iterator1,iterator2);这是删除迭代器iterator1、iterator2之间的元素。
题目描述
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。如:[1,1,2],返回2,输出[1,2]
解题思路
因为是排序数组,所以只需要比较相邻元素,如果相同那么删去该元素。这道题的关键是边界问题,有起始和终止条件要特别注意确认。
这个是以容器第一个元素开始auto i=nums.begin(),和后一个元素(*(i)==*(i+1))相比,相同:删去,不同:迭代器后移判断下一元素。那么终止条件应为end()-1;
class Solution {
public:
int removeDuplicates(vector<int>& nums)
{
if(nums.size())
{
auto i=nums.begin();
while(i!=nums.end()-1)
{
if(*(i)==*(i+1))
nums.erase(i);
else
i++;
}
}
return nums.size();
}
};
如果:是以容器的第2个元素开始auto i=nums.begin()+1,和前一个元素(*(i)==*(i-1))相比,相同:删去,不同:迭代器后移判断下一元素。那么终止条件应为end();
class Solution {
public:
int removeDuplicates(vector<int>& nums)
{
if(nums.size())
{
auto i=nums.begin()+1;
while(i!=nums.end())
{
if(*(i)==*(i-1))
nums.erase(i);
else
i++;
}
}
return nums.size();
}
};