双指针技巧:用于在链表或数组中原地索引或修改,这类过程一样平常必要数组中元素自身作比较,使用双指针(可以是差异步移动、同步移动)
左右指针是两个指针相向而行大概相背而行;快慢指针是两个指针同向而行,一快一慢。
对于单链表来说,大部分技巧都属于快慢指针,因为无法直接定位到链表的末尾。单链表的六大解题套路 都涵盖了,好比链表环判断,倒数第 K 个链表节点等问题,它们都是通过一个 fast 快指针和一个 slow 慢指针配合完成任务。
【原地修改】:
如果不是原地修改的话,直接new int[],把去重之后的元素放进这个新数组中,然后返回这个新数组即可。但是原地删除,不允许new新数组,只能在原数组上使用,然后返回一个长度,如许就可以通过返回的长度和原始数组得到我们去重后的元素有哪些了。
所以该题无所谓去重后剩余空间中的数字,无需思量剩余空间的处理。
3.接纳快慢指针计谋:让慢指针 slow 走在后面,快指针 fast 走在前面探路,找到一个不重复的元素就赋值给 slow 并让 slow 进步一步。如许,就保证了 nums[0..slow] 都是无重复的元素,当 fast 指针遍历完整个数组 nums 后,nums[0..slow] 就是整个数组去重之后的结果。
class Solution {
public int removeDuplicates(int[] nums) {
if (nums.length == 0) {
return 0;
}
int slow = 0, fast = 0;
while (fast < nums.length) {
if (nums[fast] != nums[slow]) {
slow++;
// 维护 nums[0..slow] 无重复
nums[slow] = nums[fast];
}
fast++;
}
// 数组长度为索引 + 1
return slow + 1;
}
}
复制代码
27.移除元素(8.16)
这道题和上一道思路很像,通过fast指针遍历后移来扫描元素,在满足条件时更换(赋值)slow指针,本质上是删除重复/不必要的元素,同时缩短整个数组
把nums中全部值为val的元素原地删除,依然必要使用快慢指针技巧:
如果 fast 遇到值为 val 的元素,则直接跳过,否则就赋值给 slow 指针,并让 slow 进步一步