个人总结:
快慢型指针特点、模板:元素被覆盖,而不是交换,留下的数组顺序与与原序列一致
对撞型指针特点、模板:元素被交换,留下的数组顺序不一定和原序列一致
删除元素专题:
1.leetcode第27题:原地移除所有值等于val的元素
* 方法1:使用快慢型双指针
*
* @param nums
* @param val
* @return
*/
public static int removeElement(int[] nums, int val) {
int slow = 0;
for (int fast = 0; fast < nums.length; fast++) {
if (nums[fast] != val) {
nums[slow] = nums[fast];
slow++;
}
}
//最后剩余元素的数量
return slow;
//方法2:对撞型双指针
public static int removeElement2(int[] nums, int val) {
// 3, 3, 3, [], []
int right = nums.length - 1;
int left = 0;
//为什么是left<=right 再让left加1因为left从0开始的 当left==right时 left及其左侧元素为移除后的元素
for (left = 0; left <= right; ) {
if ((nums[left] == val) && (nums[right] != val)) {
int tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
}
if (nums[left] != val) {
left++;
}
if (nums[right] == val){
right--;
}
}
return left ;
/**
* 方法三:优化对撞型双指针
* @param nums
* @param val
* @return
*/
public static int removeElement3(int[] nums, int val) {
int right = nums.length-1;
for (int left = 0; left < right; ) {
if (nums[left] == val) {
nums[left] = nums[right ];
right--;
} else {
left++;
}
}
return right;
}
2.leetcode26题:删除有序数组中的重复项
public static int removeDuplicates(int[] nums) {
//slow表示可以放入新元素的位置,索引为0的元素不用管
//第一个元素忽略
int slow = 1;
//循环起到了快指针的作用
for (int fast = 0; fast < nums.length; fast++) {
if (nums[fast] != nums[slow - 1]) {
nums[slow] = nums[fast];
slow++;
}
//把不等于slow-1的元素移到slow-1那里 然后slow++ 数不重复的元素的个数
}
return slow;
}