80.删除有序数组中的重复项II
方法:双指针
因为给定数组是有序的,所以相同元素必然连续,使用双指针解决,遍历数组检查每一个元素是否应该被保留,如果应该保留,就将其移动到指定位置。我们定义两个指针slow和fast分别为慢指针和快指针,其中慢指针表示处理出的数组长度,快指针表示已经检查过的数组的长度,即nums[fast]表示待检查的第一个元素,nums[slow-1]为上一个应该被保留的元素所移动到的指定位置
本题要求相同元素最多出现两次而非一次,所以需要检查上上个应该被保留的元素nums[slow-2]是否和当前待检查的元素nums[fast]相同。当且仅当nums[slow-2]=nums[fast]时,当前待检查元素nums[fast]不应该被保留(因为此时必然有nums[slow-2]=nums[slow-1]=nums[fast]),最后slow即为处理好的数组的长度
特别地,数组的前两个数必然可以被保留,因此对于长度不超过2的数组,无需进行任何处理,对于长度超过2的数组,直接将双指针的初始值设为2即可
class Solution {
public int removeDuplicates(int[] nums) {
int n = nums.length;
if(n<=2){
return n;
}
int slow = 2,fast = 2;
while(fast < n){
if(nums[slow - 2]!= nums[fast]){
nums[slow] = nums[fast];
++slow;
}
++fast;
}
return slow;
}
}