题目链接
思路分析
对于这道题目,题目着重强调了原地修改数组,意味着我们不能够申请额外的空间,只能够在原数组上做修改,那么我们就需要一个指针标记我们最终返回的新位置,一个指针区负责遍历整个数组
因此我们的思路就比较清晰了,使用双指针,slow指针标记我们返回的数组尾的位置,如果slow指针和fast指针指向的数字相同,意味着我们fast指针需要后移去寻找第一个不同于slow指针指向的结果,当fast和slow指向结果不同时,说明从slow到fast-1的位置数字都是相同的,我们就需要把slow+1位置的数字换成fast指向的数字,最终当fast指针指向数组尾,遍历结束,slow+1就是我们需要返回的是位置
解题代码
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size() == 0)
return 0;
int slow = 0;
int fast = 1;
for(; fast < nums.size(); ++fast)
{
//相等的时候fast后移
//不等的时候,说明找到一个不重复元素
if(nums[fast] != nums[slow])
{
nums[++slow] = nums[fast];
}
}
return slow+1;
}
};