使用快慢指针解决移除元素问题:
对应力扣(27)链接:27. 移除元素 - 力扣(LeetCode)
题目要求:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
由于复杂度限制,这里我们考虑使用快慢指针来进行解决问题。
首先了解一下什么是快慢指针?
如图,我们首先定义 上面比较大的指针为快指针,下面较小的指针为慢指针,这两个指针默认初始位置都为0。快指针和慢指针有着不同的职责:
快指针:从起始位置0开始,+1一直指向下一个位置,直到最后元素
慢指针:收集除过要删除元素的所有元素(如果为要删除的元素则不收集,慢指针不动)
假设这里我们想要移除3,首先快慢指针均如上图位置位于位置0,由于快指针指向位置0处元素1不等于3,因此用慢指针进行收集,然后指向下一个目标处。
同理:使用慢指针收集此时的元素2。指针++
这里我们发现快指针已经指向3,因此不需要使用慢指针操作,慢指针不动,快指针++
由于此时快指针继续指向元素3,因此慢指针继续不动,快指针++
此时快指针指向4,不等于我们要删除的值,因此使用慢指针收集,慢指针++
此时我们可以看到,慢指针收集的数组即为[1,2,3],此时返回慢指针索引即可(注:由于慢指针已经++操作,因此返回时不需要再进行+1操作)。
题目来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/remove-element