1.题目
就地删除即不能辅助多余数组空间。
2.法一:STL的unique
法一:直接使用stl的vector的unique去重,该去重函数不是直接删除重复元素,而是将相邻且重复的元素放入到vector的尾部,然后返回指向第一个重复元素的迭代器,所以要用erase删除尾巴的那些重复元素再统计size。
class Solution { public: int removeDuplicates(vector<int>& nums) { nums.erase(unique(nums.begin(),nums.end()),nums.end()); return nums.size(); } };
3.法二:双指针
法一是偷鸡,法二才正经哈哈。这题双指针和【LeetCode27】移除元素(双指针)类似,和27题不同的是这题j先加1后赋值,最后返回值注意j只是下标,求个数j还要1。
i为快指针,j为慢指针。
初始j在下标0,i先到下标1:
(1)如果相同则i不用理——i前进一格;
(2)如果不相同则j前进一格,i所在的元素复制给j现在的位置。
如下图:当快指针指向元素和慢指针相同时,慢指针不用动,快指针继续前进一格。而下一步当快指针到了元素4时,就需要扩充0到slow的范围(即慢指针+1后),将fast的元素仍进slow的元素。
class Solution { public: int removeDuplicates(vector<int>& nums) { if(nums.size()==0) return NULL; int j=0;//i为快指针,j为慢指针 for(int i=1;i<nums.size();i++){ if(nums[i]!=nums[j]){ j++; nums[j]=nums[i]; } } return j+1; } };