题目
解题思路
自己的解题思路
首先当时是这样子思考的,因为只看到需要在原地修改数组这个要求,所以当时想的是使用内置函数erase来删除重复的元素(需要注意的是:erase函数返回的是删除元素之后元素的迭代器),所以代码如下:
int removeDuplicates(vector<int>& nums) {
int size = nums.size();
if (size == 0)
return 0;
auto it1 = nums.begin();
int i = *it1;
it1 = it1 + 1;
while (it1 != nums.end()) {
if (*it1 == i)
it1 = nums.erase(it1);
else {
i = *it1;
++it1;
}
}
return nums.size();
}
设置一个前驱,如果元素值等于前驱,则被删除,如果不相等,则更新前驱元素,然后遍历下一个元素,这种方法用时比较多
参考思路
我们要注意到的题目一个条件就是你不需要考虑数组中超出新长度后面的元素。,那么这个要求的意思是:你只需要将不重复的元素放置在你所返回的n个长度位置上,后面的你不需要删除它,所以知道这个要求之后我们就不需要再考虑删除问题了,这里使用的是快慢指针,直接上代码:
int removeDuplicates(vector<int>& nums) {
if (nums.size() < 2)
return nums.size();
int j = 0;
for (int i = 0; i < nums.size(); i++) {
if (nums[j] != nums[i])
nums[++j] = nums[i];
}
return ++j;
}
我们直接将不重复的元素依次放在头指针的后面即可。否则如果相等,则直接跳过
总结
这题需要看清楚条件,不要求将重复元素删去,只是要求你在原容器中进行修改操作
clearLB 发布了19 篇原创文章 · 获赞 0 · 访问量 337 私信 关注