移除元素
数组 双指针题目描述
给定一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。由于是原地修改,你不应使用额外的数组,而是在当前数组的基础上进行调整。
完成后,你需要返回新数组的长度。系统会根据这个长度来读取数组的前部分,确保这部分只包含你筛选后的有效数字。
思路分析
最直观的方法是在遍历过程中遇到匹配的数字就将其删除,但这种做法往往需要后续元素的大量平移,效率较低。
我们可以采用“双快慢指针”的策略。这两个指针最初都指向数组的开头。
- 快指针 (fast):它是我们的侦察兵,逐个检查数组中的每个数字。
- 慢指针 (slow):它是我们的守门员,记录下一个“合格数字”该放的位置。
如果我们遇到一个不等于 val 的数字,就把它搬移到慢指针当前所在的位置,并将慢指针向后移动一步。反之,如果快指针遇到了 val,我们就直接跳过它。最后,慢指针指向的位置数字,正是新数组中有效元素的总个数。
示例代码
复杂度分析
- 时间复杂度:
O(n),其中n是数组的长度。我们只需要遍历一遍数组。 - 空间复杂度:
O(1),我们只使用了两个额外的指针变量,符合原地修改的要求。