今天是2024年4月10日,是开始刷Leetcode面试经典 150 题的第一天。
一道值得记录的双指针:
Leetcode27.移除元素
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
思路及算法
由于题目要求删除数组中等于 val 的元素,因此输出数组的长度一定小于等于输入数组的长度,我们可以把输出的数组直接写在输入数组上。可以使用双指针:右指针 right 指向当前将要处理的元素,左指针left 指向下一个将要赋值的位置。这个时候注意了!!为了处理第一个元素,我们的left和right的指针其实是从同一个地方出发,否则第一个元素是无法判断的!!!
如果右指针指向的元素不等于 val,它一定是输出数组的一个元素,我们就将右指针指向的元素复制到左指针位置,然后将左右指针同时右移;
如果右指针指向的元素等于 val,它不能在输出数组里,此时左指针不动,右指针右移一位。
整个过程保持不变的性质是:区间 [0,left) 中的元素都不等于 val。当左右指针遍历完输入数组以后,left的值就是输出数组的长度。非常巧妙
启发:在遇到这样的题目,就是需要把东西换到前面去的题目(有的保留,有的不保留),都可以考虑用双指针!!!!