来源:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2gy9m/
题解一:不能使用额外的空间,则只有在给定的数组上面进行操作。使用双指针,j 指针对整个数组进行扫描,i 指针则从头覆盖掉重复的位置,较简单直接上代码。
代码:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()==0) return 0;
int i=0;///慢指针在重复位置新的
for(int j=1;j<nums.size();j++){///快指针进行扫描
if(nums[j]!=nums[i])
{
nums[++i]=nums[j];
}
}
return i+1;///++i是直接从数组的第二个元素进行存放,返回总体数量时需要再+1
}
};
题解二:用STL中的unique函数和erase函数它不香嘛,然后直接返回容器的大小就OK了,速度比上面的更快。两个函数的使用方法,网上有很多写的好的博客,就不详细了。
代码:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
vector<int>::iterator sta=nums.begin();
vector<int>::iterator end=nums.end();
vector<int>::iterator new_end;
new_end=unique(sta,end);
nums.erase(new_end,end);
return nums.size();
}
};
性能截图: