1、概述
快慢型双指针(一起向前走,一快一慢)
对撞型(相向型)双指针(两端走向中间)
背向型双指针(中间走向两端)
2、删所有
原地删除所有值为val的元素,返回删除后的长度
例1: 输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
例2:输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
快慢型会保证顺序
1、快慢型
public static int removeElement(int[] a, int val){
int slow = 0;
for (int fast = 0; fast < a.length; fast++) {
if(a[fast] != val){
a[slow] = a[fast];
slow++;
}
}
return slow;
}
2、对撞型
//对撞型指针
public static int removeElement2(int[] a, int val){
int left;
int right = a.length - 1;
for (left = 0; left <= right; ) {
if((a[left] == val) && (a[right] != val)){
int tmp = a[left];
a[left] = a[right];
a[right] = tmp;
}
if(a[left] != val) left++;
if(a[right] == val) right--;
}
return left;
}
3、优化对撞型(快排的某一轮)
//优化的对撞型指针,(快排的某一轮)
public static int removeElement3(int[] a, int val){
int right = a.length - 1;
for (int left = 0; left <= right; ) {
if(a[left] == val){
a[left] = a[right];
right--;
}else{
left++;
}
}
return right + 1;
}
3、删重复
public static int removeDuplicates(int[] nums){
int slow = 1;
for (int fast = 0; fast < nums.length; fast++) {
if(nums[slow - 1] != nums[fast]){
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}