双指针法移除元素
思路
既然问题要求我们就地删除给定值的所有元素,我们就必须用 O(1) 的额外空间来处理它。如何解决?我们可以保留两个指针 i 和 j,其中 i 是慢指针,j 是快指针。
算法
当 nums[j] 与给定的值相等时,递增 j 以跳过该元素。只要 nums[j]≠val,我们就复制 nums[j] 到 nums[i] 并同时递增两个索引。重复这一过程,直到 j 到达数组的末尾,该数组的新长度为 i。
该解法与 删除排序数组中的重复项https://link.zhihu.com/?target=https%3A//leetcode-cn.com/articles/remove-duplicates-from-sorted-array/的解法十分相似。
Java 代码实现
public int removeElement(int[] nums, int val) {int i = 0;for (int j = 0; j < nums.length; j++) {if (nums[j] != val) {nums[i] = nums[j];i++;}}return i;
}
复杂度分析
- 时间复杂度:O(n), 假设数组总共有 n 个元素,i 和 j 至少遍历 2n 步。
- 空间复杂度:O(1)。