数组——双指针:80.删除有序数组中的重复项 II
题目链接
80.删除有序数组中的重复项 II
题目重构
允许每个元素最多出现两次,原地删除多余的重复元素,并返回去重后的数组长度。
思路
我们用双指针
的方法。因为题目允许每个元素出现两次,所以数组前两个元素我们不需要进行多余的判定。长度 ≤2
的数组,无论如何都不会有超过2次的重复,我们直接返回数组长度。
我们的快慢指针可以直接从2
开始。快指针遍历数组所有元素,慢指针指向我们可以安全写入的位置。fast
元素要与slow - 2
元素比较是否不相等,如果相等的话说明slow - 2
,slow - 1
,以及当前的fast
元素都相等(slow
是待插入位置,判定时指向的是未知元素),违背了每个元素最多两个的设定,不相等就说明最多两个,可以将fast
元素放进slow
位置,同时更新slow
指针。
代码
int n = nums.size();
if (n <= 2) {return n;
}
int fast = 2, slow = 2;
while (fast < n) {if (nums[slow - 2] != nums[fast]) {nums[slow] = nums[fast];slow++;}fast++;
}
return slow;