题目描述:
思路:
运用双指针法。
注意一定要考虑数组长度为0 的情况,不然会报错。
代码:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()==0) return 0;//一定要注意这种情况
int j=0;
for(int i=1;i<nums.size();i++){
if(nums[i]!=nums[j]){
j++; //关键
nums[j]=nums[i]; //删除操作
}
}
return j+1;
}
};
法二:
刚刚开始一直想用vector.erase()直接删除重复元素,但是结果一直不对,后面发现原来是没有搞清楚erase()的删除机制。
在向量中 erase 删除一个元素以后,删除元素的下一个元素会自动补到之前删除元素的位置。假如向量为[1,1,1,1],第0个位置和第一个位置元素重复,erase删除第0个元素以后,第一个元素1会自动到0位,向量变为[1,1,1],如果不做处理就是i++的话,会导致第一个元素没有进行比较。应该改为: 如果相等,先删除,在i--,对0位的元素在进行判断。
代码:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if (nums.size()==0) return 0;
for(int i=0;i<nums.size()-1;i++){
if(nums[i]==nums[i+1]){
nums.erase(nums.begin()+i);
i--; //关键
}
}
int len=nums.size();
return len;
}
};