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),原地修改,没有使用额外空间。
这是经典的“原地删除”问题,通过双指针高效解决。
