Java双指针法:原地移除数组元素
Java双指针法:原地移除数组元素
- 代码解析
- 关键点
- 示例
- 特点
代码解析
class Solution {public int removeElement(int[] nums, int val) {int cur = 0; // 初始化一个指针 `cur`,表示新数组的当前写入位置for (int i = 0; i < nums.length; i++) { // 遍历原数组if (nums[i] != val) { // 如果当前元素不等于 `val`nums[cur++] = nums[i]; // 将该元素写入新位置,并移动 `cur` 指针}}return cur; // 返回新数组的长度(即有效元素的个数)}
}
这段代码是一个 Java 方法,名为 removeElement
,它的功能是原地移除数组中所有等于给定值 val
的元素,并返回移除后数组的新长度。以下是详细解释:
关键点
-
双指针思想:
i
:快指针,遍历原数组的所有元素。cur
:慢指针,指向新数组中下一个可以写入的位置。
-
操作逻辑:
- 遍历数组时,如果当前元素
nums[i]
不等于val
,就将其复制到nums[cur]
,然后cur
自增。 - 如果等于
val
,则直接跳过,不复制。
- 遍历数组时,如果当前元素
-
结果:
- 最终
cur
的值就是新数组的长度(因为cur
记录了所有保留元素的个数)。 - 原数组的前
cur
个元素是移除val
后的结果(后面的元素可能未被覆盖,但题目不关心)。
- 最终
示例
假设输入:
nums = [3, 2, 2, 3], val = 3
执行过程:
i=0
:nums[0]=3
(等于val
,跳过)。i=1
:nums[1]=2
(不等于val
,复制到nums[0]
,cur
变为 1)。i=2
:nums[2]=2
(不等于val
,复制到nums[1]
,cur
变为 2)。i=3
:nums[3]=3
(等于val
,跳过)。
最终:
- 新数组前
cur=2
个元素为[2, 2]
。 - 返回
2
。
特点
- 时间复杂度:O(n),只需遍历一次数组。
- 空间复杂度:O(1),原地修改,没有使用额外空间。
这是经典的“原地删除”问题,通过双指针高效解决。