解法1
双指针
一个指针,从左向右滑动
另一个指针的左边是存放1~2次的重复数字,指向最新的插入位置
cnt计数,统计出现次数
class Solution {
public int removeDuplicates(int[] nums) {
int k = 1, pre = nums[0], cnt = 1;
for (int i = 1; i < nums.length; i++) {
if (nums[i] == pre) {
cnt++;
if (cnt < 3) {
nums[k++] = nums[i];
}
} else {
cnt = 1;
nums[k++] = nums[i];
pre = nums[i];
}
}
return k;
}
}
解法2
快慢指针
快指针:从左向右滑动
慢指针:指向最新的插入位置,slow - 2支持放两次
slow-1则为只放一次
class Solution {
public int removeDuplicates(int[] nums) {
final int n = nums.length;
if (n < 3) {
return n;
}
int slow = 2, fast = 2;
while (fast < n) {
if (nums[slow - 2] != nums[fast]) {
nums[slow++] = nums[fast];
}
++fast;
}
return slow;
}
}