删除有序数组重复项
给你一个有序数组 nums
,请你** 原地** 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
这是一道典型的双指针题,一个指针count指向结果数组的下一个位置,也就是存放满足结果数组条件的下一个元素位置,另一个指针i在后面去找符合结果的元素.
因为满足结果数组存放的条件是不超过两个相同数字,所以我们一开始在结果数组中存放两个元素(这两个元素肯定符合要求),然后我们开始用指针i在外面去寻找符合条件的元素,符合条件的要求就是不等于指针count-2指向的位置,因为不能超过3个相同元素.
如果找到了符合条件的元素,那我们就先将这个元素放进我们刚刚准备的count位置,然后扩容一位结果数组,即count++.如果没有找到,那count不动,后面那个指针自己接着向后遍历即可.
代码如下:
class Solution {
public int removeDuplicates(int[] nums) {
int count = 2;
for (int i = 2; i < nums.length; i++) {
if(nums[i] != nums[count-2]){
nums[count] = nums[i];
count++;
}
}
return count;
}
}
推广到保留n个相同元素
也是一样的思路,前n个元素不用判断,结果数组指针指向n+1的位置,然后后指针去找就行.