https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
我的方法一:快慢指针
步骤
- slow和fast的指针分别指向去重后的最后一位和正在遍历的一位
- 如果slow和fast对应的值一样,说明重复了,所以忽略fast对应的值,将fast向后挪一位
- 如果slow和fast对应的值不一样,说明不重复,所以先将slow往后挪一位,将fast对应的值设置给slow,然后fast也往后挪一位;
初始条件
- slow=0 fast=1
边界条件
- 长度必须大于1,小于等于1直接返回原始长度即可
- 去重后的长度是slow++,因为slow是位置,长度需要+1
代码
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size() < 2) {
return nums.size();
}
int n = nums.size();
int slow = 0;
int fast = 1;
while(fast < n) {
if(nums[fast] == nums[slow]) {
fast++;
}else{
nums[++slow] = nums[fast++];
}
}
return ++slow;
}
};