删除排序数组中的重复项 II
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
//自己思路 从2开始,比较第0号的数字是否与2号的数字相等,不相等右坐标就一直右移,直到找到不相等的数,并将它赋给第l号的位置,l++。
public int removeDuplicates(int[] nums) {
int len = nums.length;
if (len <= 2) {
return len;
}
if (nums == null) {
return -1;
}
int l = 2;
int r = 2;
while (r < len) {
if (nums[l-2] != nums[r]) {
nums[l] = nums[r];
l++;
}
r++;
}
return l ;
}
/*
1. 首先我们先让前 2 位直接保留,得到 1,1
2. 对后面的每一位进行继续遍历,能够保留的前提是与当前位置的前面 k 个元素不同(答案中的第一个 1),因此我们会跳过剩余的 1,将第一个 2 追加,得到 1,1,2
3. 继续这个过程,这时候是和答案中的第 2 个 1 进行对比,因此可以得到 1,1,2,2
4. 这时候和答案中的第 1 个 2 比较,只有与其不同的元素能追加到答案,因此剩余的 2 被跳过,3 被追加到答案:1,1,2,2,3
*/
public int removeDuplicates(int[] nums) {
return process(nums, 2);//调用时直接传入需要多少位重复的数
}
int process(int[] nums, int k) {
int u = 0; //计数器
for (int x : nums) {
if (u < k || nums[u - k] != x) nums[u++] = x;
}
return u;
}

回顾双指针,以及新思路
浙公网安备 33010602011771号